diff --git a/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionEditModal.tsx b/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionEditModal.tsx index dbdeaf5feb..d4bf297875 100644 --- a/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionEditModal.tsx +++ b/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionEditModal.tsx @@ -1,5 +1,5 @@ import { AnswerCollection } from '@klicker-uzh/graphql/dist/ops' -import { H3, Modal, Toast } from '@uzh-bf/design-system' +import { H3, Modal, Toast, UserNotification } from '@uzh-bf/design-system' import { useTranslations } from 'next-intl' import { useState } from 'react' import AddAnswerCollectionEntry from './AddAnswerCollectionEntry' @@ -27,22 +27,32 @@ function AnswerCollectionEditModal({ onClose() }} title={t('manage.resources.answerCollection', { name: collection.name })} + dataCloseButton={{ cy: 'close-answer-collection-edit-modal' }} escapeDisabled > -
+

{t('manage.resources.answerOptions')}

+ {collection.entries?.some( + (entry) => (entry.numSolutionUsages ?? 0) > 0 + ) ? ( + + ) : null} {collection.entries!.map((entry, ix) => ( {editable ? ( -
- -
{t('manage.resources.clickToViewEdit')}
+
+ {(collection.numSharedUsers ?? 0) > 0 ? ( +
+ {collection.numSharedUsers ?? 0} + +
+ ) : null} +
+ +
{t('manage.resources.clickToViewEdit')}
+
) : accessGranted ? (
diff --git a/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionOption.tsx b/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionOption.tsx index 1771e4d233..81b791824f 100644 --- a/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionOption.tsx +++ b/apps/frontend-manage/src/components/resources/answerCollections/AnswerCollectionOption.tsx @@ -1,8 +1,9 @@ import { useMutation } from '@apollo/client' import { faTrashCan } from '@fortawesome/free-regular-svg-icons' -import { faPencil, faSave } from '@fortawesome/free-solid-svg-icons' +import { faPencil, faSave, faWarning } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { + AnswerCollectionEntry, DeleteAnswerCollectionEntryDocument, EditAnswerCollectionEntryDocument, GetAnswerCollectionsDocument, @@ -13,17 +14,17 @@ import { Dispatch, SetStateAction, useState } from 'react' import { twMerge } from 'tailwind-merge' function AnswerCollectionOption({ - id, - value, + entry, index, + last, collectionId, deletionDisabled, editDisabled, setEditDisabled, }: { - id: number - value: string + entry: AnswerCollectionEntry index: number + last: boolean collectionId: number deletionDisabled?: boolean editDisabled: boolean @@ -36,21 +37,28 @@ function AnswerCollectionOption({ const [deleteAnswerCollectionEntry] = useMutation( DeleteAnswerCollectionEntryDocument ) + const deletionNotAllowed = + deletionDisabled || (entry.numSolutionUsages ?? 0) > 0 return ( -
+
) : null}
{editMode ? ( { setSubmitting(true) - if (value !== values.value) { + if (entry.value !== values.value) { await editAnswerCollectionEntry({ - variables: { id, value: values.value }, + variables: { id: entry.id, value: values.value }, update: (cache, { data }) => { if (!data?.editAnswerCollectionEntry) return @@ -144,12 +152,12 @@ function AnswerCollectionOption({ if (collection.id === collectionId) { return { ...collection, - entries: collection.entries?.map((entry) => { - if (entry.id === id) { - return { ...entry, value: values.value } + entries: collection.entries?.map((e) => { + if (e.id === entry.id) { + return { ...e, value: values.value } } - return entry + return e }), } } @@ -193,9 +201,12 @@ function AnswerCollectionOption({ )} ) : ( - value + entry.value )}
+ {(entry.numSolutionUsages ?? 0) > 0 ? ( + + ) : null}
) } diff --git a/cypress/cypress/e2e/D-questions-workflow.cy.ts b/cypress/cypress/e2e/D-questions-workflow.cy.ts index 4802440068..d854aaf5cd 100644 --- a/cypress/cypress/e2e/D-questions-workflow.cy.ts +++ b/cypress/cypress/e2e/D-questions-workflow.cy.ts @@ -71,12 +71,14 @@ const SEExplanation = 'Selection Question Explanation' const SECollection = 'Private Collection (Vegetables)' // from seed (access otherwise is tested in resources workflow) const SEInputs = 2 const SESolutions = ['Cabbage', 'Cucumber'] +const SESolutionsNotChosen = ['Artichoke', 'Broccoli', 'Dill', 'Carrot'] const SETitleEdited = 'Selection Question Title Edited' const SEContentEdited = 'Selection Question Text Edited' const SEExplanationEdited = 'Selection Question Explanation Edited' const SECollectionEdited = 'Public Collection (Fruits)' // from seed const SEInputsEdited = 1 const SESolutionsEdited = ['Apple', 'Banana'] +const SESolutionsNotChosenEdited = ['Cherry', 'Date', 'Elderberry'] describe('Create different types of elements (with and without sample solution) and edit them', () => { beforeEach(() => { @@ -1134,6 +1136,26 @@ describe('Create different types of elements (with and without sample solution) cy.get('[data-cy="close-question-modal"]').click() }) + it('Check that all options of the answer collection can be edited', () => { + cy.loginLecturer() + cy.get('[data-cy="resources"]').click() + cy.get(`[data-cy="answer-collection-${SECollection}"]`).click() + + SESolutions.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should( + 'not.be.disabled' + ) + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + SESolutionsNotChosen.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should( + 'not.be.disabled' + ) + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + cy.get("[data-cy='close-answer-collection-edit-modal']").click() + }) + it('Add a sample solution to the created selection question', () => { cy.get(`[data-cy="edit-question-${SETitle}"]`).click() cy.get('[data-cy="insert-question-title"]').should('have.value', SETitle) @@ -1162,6 +1184,27 @@ describe('Create different types of elements (with and without sample solution) cy.get('[data-cy="close-question-modal"]').click() }) + it('Check that the options that are used as a solution cannot be deleted anymore', () => { + cy.loginLecturer() + cy.get('[data-cy="resources"]').click() + cy.get(`[data-cy="answer-collection-${SECollection}"]`).click() + cy.findByText(messages.manage.resources.answerOptionUsedAsSolution).should( + 'exist' + ) + + SESolutions.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should('be.disabled') + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + SESolutionsNotChosen.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should( + 'not.be.disabled' + ) + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + cy.get("[data-cy='close-answer-collection-edit-modal']").click() + }) + it('Edit the selection question and change the answer collection (including new sample solutions)', () => { cy.get(`[data-cy="edit-question-${SETitle}"]`).click() cy.get('[data-cy="insert-question-title"]') @@ -1215,6 +1258,39 @@ describe('Create different types of elements (with and without sample solution) }) }) + it('Check that only answer options not used as solutions can be deleted', () => { + cy.loginLecturer() + cy.get('[data-cy="resources"]').click() + cy.get(`[data-cy="answer-collection-${SECollection}"]`).click() + + SESolutions.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should( + 'not.be.disabled' + ) + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + SESolutionsNotChosen.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should( + 'not.be.disabled' + ) + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + cy.get("[data-cy='close-answer-collection-edit-modal']").click() + + cy.get(`[data-cy="answer-collection-${SECollectionEdited}"]`).click() + SESolutionsEdited.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should('be.disabled') + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + SESolutionsNotChosenEdited.forEach((sol) => { + cy.get(`[data-cy="delete-answer-option-${sol}"]`).should( + 'not.be.disabled' + ) + cy.get(`[data-cy="edit-answer-option-${sol}"]`).should('not.be.disabled') + }) + cy.get("[data-cy='close-answer-collection-edit-modal']").click() + }) + it('Create a new question, duplicates it and then deletes the duplicate again', () => { const randomNumber = uuid() const questionTitle = 'A Single Choice ' + randomNumber diff --git a/cypress/cypress/e2e/K-resources-workflow.cy.ts b/cypress/cypress/e2e/K-resources-workflow.cy.ts index 5959a44a38..9d7498f86d 100644 --- a/cypress/cypress/e2e/K-resources-workflow.cy.ts +++ b/cypress/cypress/e2e/K-resources-workflow.cy.ts @@ -171,32 +171,28 @@ describe('Create, edit and share answer collections', () => { .contains(privateDescriptionNew) cy.get('[data-cy="save-changes-answer-collection"]').click() - privateItems.forEach((value, ix) => { - cy.get(`[data-cy="answer-option-${ix}"]`).contains(value) + privateItems.forEach((value) => { + cy.get(`[data-cy="answer-option-${value}"]`).contains(value) }) privateItems.forEach((value, ix) => { - cy.get(`[data-cy="edit-answer-option-${ix}"]`).click() + cy.get(`[data-cy="edit-answer-option-${value}"]`).click() cy.get(`[data-cy="edit-answer-option-input"]`).should('have.value', value) cy.get(`[data-cy="edit-answer-option-input"]`) .clear() .type(privateItemsNew[ix]) cy.get(`[data-cy="save-edit-answer-option"]`).click() - cy.get(`[data-cy="answer-option-${ix}"]`).contains(privateItemsNew[ix]) + cy.get(`[data-cy="answer-option-${privateItemsNew[ix]}"]`).contains( + privateItemsNew[ix] + ) }) - cy.get( - `[data-cy="delete-answer-option-${privateItemsNew.length - 1}"]` - ).click() - cy.get(`[data-cy="answer-option-${privateItemsNew.length - 1}"]`).should( - 'not.exist' - ) + + const lastElement = privateItemsNew[privateItemsNew.length - 1] + cy.get(`[data-cy="delete-answer-option-${lastElement}"]`).click() + cy.get(`[data-cy="answer-option-${lastElement}"]`).should('not.exist') cy.get(`[data-cy="add-answer-option"]`).click() - cy.get(`[data-cy="input-new-answer-option"]`).type( - privateItemsNew[privateItemsNew.length - 1] - ) + cy.get(`[data-cy="input-new-answer-option"]`).type(lastElement) cy.get(`[data-cy="save-new-answer-option"]`).click() - cy.get(`[data-cy="answer-option-${privateItemsNew.length - 1}"]`).contains( - privateItemsNew[privateItemsNew.length - 1] - ) + cy.get(`[data-cy="answer-option-${lastElement}"]`).contains(lastElement) }) it('Verify that the changes to the private answer catalogue persist', () => { @@ -212,7 +208,7 @@ describe('Create, edit and share answer collections', () => { .realClick() .contains(privateDescriptionNew) privateItemsNew.forEach((value, ix) => { - cy.get(`[data-cy="answer-option-${ix}"]`).contains(value) + cy.get(`[data-cy="answer-option-${value}"]`).contains(value) }) }) diff --git a/packages/graphql/src/graphql/ops/QGetAnswerCollections.graphql b/packages/graphql/src/graphql/ops/QGetAnswerCollections.graphql index 549c0eebbd..f305da8df9 100644 --- a/packages/graphql/src/graphql/ops/QGetAnswerCollections.graphql +++ b/packages/graphql/src/graphql/ops/QGetAnswerCollections.graphql @@ -9,6 +9,7 @@ query GetAnswerCollections { entries { id value + numSolutionUsages } } sharedCollections { diff --git a/packages/graphql/src/ops.schema.json b/packages/graphql/src/ops.schema.json index 53735edaab..fcc65260a4 100644 --- a/packages/graphql/src/ops.schema.json +++ b/packages/graphql/src/ops.schema.json @@ -962,6 +962,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "numSolutionUsages", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "value", "description": null, diff --git a/packages/graphql/src/ops.ts b/packages/graphql/src/ops.ts index 3def2fee04..63bcf3abf0 100644 --- a/packages/graphql/src/ops.ts +++ b/packages/graphql/src/ops.ts @@ -123,6 +123,7 @@ export type AnswerCollection = { export type AnswerCollectionEntry = { __typename?: 'AnswerCollectionEntry'; id: Scalars['Int']['output']; + numSolutionUsages?: Maybe; value: Scalars['String']['output']; }; @@ -3967,7 +3968,7 @@ export type GetAnswerCollectionSelectionQuery = { __typename?: 'Query', getAnswe export type GetAnswerCollectionsQueryVariables = Exact<{ [key: string]: never; }>; -export type GetAnswerCollectionsQuery = { __typename?: 'Query', getAnswerCollections?: { __typename?: 'UserAnswerCollections', answerCollections: Array<{ __typename?: 'AnswerCollection', id: number, name: string, access: CollectionAccess, description: string, numSharedUsers?: number | null, entries?: Array<{ __typename?: 'AnswerCollectionEntry', id: number, value: string }> | null }>, sharedCollections: Array<{ __typename?: 'AnswerCollection', id: number, name: string, access: CollectionAccess, description: string, ownerShortname?: string | null, entries?: Array<{ __typename?: 'AnswerCollectionEntry', id: number, value: string }> | null }>, requestedCollections: Array<{ __typename?: 'AnswerCollection', id: number, name: string, access: CollectionAccess, description: string, ownerShortname?: string | null }> } | null }; +export type GetAnswerCollectionsQuery = { __typename?: 'Query', getAnswerCollections?: { __typename?: 'UserAnswerCollections', answerCollections: Array<{ __typename?: 'AnswerCollection', id: number, name: string, access: CollectionAccess, description: string, numSharedUsers?: number | null, entries?: Array<{ __typename?: 'AnswerCollectionEntry', id: number, value: string, numSolutionUsages?: number | null }> | null }>, sharedCollections: Array<{ __typename?: 'AnswerCollection', id: number, name: string, access: CollectionAccess, description: string, ownerShortname?: string | null, entries?: Array<{ __typename?: 'AnswerCollectionEntry', id: number, value: string }> | null }>, requestedCollections: Array<{ __typename?: 'AnswerCollection', id: number, name: string, access: CollectionAccess, description: string, ownerShortname?: string | null }> } | null }; export type GetArtificialInstanceQueryVariables = Exact<{ elementId: Scalars['Int']['input']; @@ -4595,7 +4596,7 @@ export const CheckValidCoursePinDocument = {"kind":"Document","definitions":[{"k export const GetActiveUserCoursesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetActiveUserCourses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getActiveUserCourses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"pinCode"}},{"kind":"Field","name":{"kind":"Name","value":"isArchived"}},{"kind":"Field","name":{"kind":"Name","value":"isGamificationEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"isGroupCreationEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"endDate"}},{"kind":"Field","name":{"kind":"Name","value":"groupDeadlineDate"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode; export const GetActivityAnalyticsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetActivityAnalytics"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"activityId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getActivityAnalytics"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"activityId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"activityId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"activityName"}},{"kind":"Field","name":{"kind":"Name","value":"activityType"}},{"kind":"Field","name":{"kind":"Name","value":"courseParticipants"}},{"kind":"Field","name":{"kind":"Name","value":"instanceQuizAnalytics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementName"}},{"kind":"Field","name":{"kind":"Name","value":"elementType"}},{"kind":"Field","name":{"kind":"Name","value":"numberOfAnswers"}},{"kind":"Field","name":{"kind":"Name","value":"uniqueParticipants"}},{"kind":"Field","name":{"kind":"Name","value":"averageTimeSpent"}},{"kind":"Field","name":{"kind":"Name","value":"firstErrorRate"}},{"kind":"Field","name":{"kind":"Name","value":"firstPartialRate"}},{"kind":"Field","name":{"kind":"Name","value":"firstCorrectRate"}},{"kind":"Field","name":{"kind":"Name","value":"lastErrorRate"}},{"kind":"Field","name":{"kind":"Name","value":"lastPartialRate"}},{"kind":"Field","name":{"kind":"Name","value":"lastCorrectRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalErrorRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalPartialRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalCorrectRate"}},{"kind":"Field","name":{"kind":"Name","value":"upvoteRate"}},{"kind":"Field","name":{"kind":"Name","value":"downvoteRate"}},{"kind":"Field","name":{"kind":"Name","value":"feedbackCount"}}]}},{"kind":"Field","name":{"kind":"Name","value":"activityQuizAnalytics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"numberOfAnswers"}},{"kind":"Field","name":{"kind":"Name","value":"averageTimeSpent"}},{"kind":"Field","name":{"kind":"Name","value":"firstErrorRate"}},{"kind":"Field","name":{"kind":"Name","value":"firstPartialRate"}},{"kind":"Field","name":{"kind":"Name","value":"firstCorrectRate"}},{"kind":"Field","name":{"kind":"Name","value":"lastErrorRate"}},{"kind":"Field","name":{"kind":"Name","value":"lastPartialRate"}},{"kind":"Field","name":{"kind":"Name","value":"lastCorrectRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalErrorRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalPartialRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalCorrectRate"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetAnswerCollectionSelectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAnswerCollectionSelection"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAnswerCollectionSelection"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"access"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"ownerShortname"}},{"kind":"Field","name":{"kind":"Name","value":"entries"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}}]}}]} as unknown as DocumentNode; -export const GetAnswerCollectionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAnswerCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAnswerCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"answerCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"access"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"numSharedUsers"}},{"kind":"Field","name":{"kind":"Name","value":"entries"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"sharedCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"access"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"ownerShortname"}},{"kind":"Field","name":{"kind":"Name","value":"entries"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"requestedCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"access"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"ownerShortname"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetAnswerCollectionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAnswerCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAnswerCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"answerCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"access"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"numSharedUsers"}},{"kind":"Field","name":{"kind":"Name","value":"entries"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"numSolutionUsages"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"sharedCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"access"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"ownerShortname"}},{"kind":"Field","name":{"kind":"Name","value":"entries"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"requestedCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"access"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"ownerShortname"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetArtificialInstanceDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetArtificialInstance"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"elementId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"artificialInstance"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"elementId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"elementId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"elementType"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ElementData"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ElementData"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ElementInstance"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"elementData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ChoicesElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}},{"kind":"Field","name":{"kind":"Name","value":"options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasSampleSolution"}},{"kind":"Field","name":{"kind":"Name","value":"displayMode"}},{"kind":"Field","name":{"kind":"Name","value":"choices"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ix"}},{"kind":"Field","name":{"kind":"Name","value":"correct"}},{"kind":"Field","name":{"kind":"Name","value":"feedback"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NumericalElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}},{"kind":"Field","name":{"kind":"Name","value":"options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasSampleSolution"}},{"kind":"Field","name":{"kind":"Name","value":"accuracy"}},{"kind":"Field","name":{"kind":"Name","value":"placeholder"}},{"kind":"Field","name":{"kind":"Name","value":"unit"}},{"kind":"Field","name":{"kind":"Name","value":"restrictions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"min"}},{"kind":"Field","name":{"kind":"Name","value":"max"}}]}},{"kind":"Field","name":{"kind":"Name","value":"solutionRanges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"min"}},{"kind":"Field","name":{"kind":"Name","value":"max"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exactSolutions"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FreeTextElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}},{"kind":"Field","name":{"kind":"Name","value":"options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasSampleSolution"}},{"kind":"Field","name":{"kind":"Name","value":"restrictions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"maxLength"}}]}},{"kind":"Field","name":{"kind":"Name","value":"solutions"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FlashcardElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ContentElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetBasicCourseInformationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetBasicCourseInformation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"basicCourseInformation"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"courseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"shortname"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetBookmarkedElementStacksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetBookmarkedElementStacks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getBookmarkedElementStacks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"courseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"order"}},{"kind":"Field","name":{"kind":"Name","value":"elements"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"elementType"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ElementDataWithoutSolutions"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ElementDataWithoutSolutions"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ElementInstance"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"elementData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ChoicesElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}},{"kind":"Field","name":{"kind":"Name","value":"options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"displayMode"}},{"kind":"Field","name":{"kind":"Name","value":"choices"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ix"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NumericalElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}},{"kind":"Field","name":{"kind":"Name","value":"options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"accuracy"}},{"kind":"Field","name":{"kind":"Name","value":"placeholder"}},{"kind":"Field","name":{"kind":"Name","value":"unit"}},{"kind":"Field","name":{"kind":"Name","value":"restrictions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"min"}},{"kind":"Field","name":{"kind":"Name","value":"max"}}]}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FreeTextElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}},{"kind":"Field","name":{"kind":"Name","value":"options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"restrictions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"maxLength"}}]}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FlashcardElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ContentElementData"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"elementId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"explanation"}},{"kind":"Field","name":{"kind":"Name","value":"pointsMultiplier"}}]}}]}}]}}]} as unknown as DocumentNode; diff --git a/packages/graphql/src/public/client.json b/packages/graphql/src/public/client.json index 719f9e1615..e20e247d41 100644 --- a/packages/graphql/src/public/client.json +++ b/packages/graphql/src/public/client.json @@ -120,7 +120,7 @@ "GetActiveUserCourses": "877f83a65cb320f69a51a5bf243f0d62bb8cce9e4c1d0bcab8cec8dd367bed86", "GetActivityAnalytics": "bcbe895236bd0027e2db37d5884645cfa3230e90a7ce6de893783c5fdc54fa1b", "GetAnswerCollectionSelection": "7cbf90cbf98dc1ab0d35d0f134e9fdb46b1b2686fb66d8be31815b451bb083dc", - "GetAnswerCollections": "ca781774282830f11ab5aa1f0edd036fb694c52ec5ab27b410dac8f578267668", + "GetAnswerCollections": "85b9a7a98c76c5b7653021cd0d901a0c4446780622715563904bed529eb56bf5", "GetArtificialInstance": "af867c3f5673d1ccdab5912713886d47189c6c8cc393c8b46f58dc75cdff654b", "GetBasicCourseInformation": "14169116abd9278adb08977b9c153403e6065ab0c3d02a6beb38017e1c8b19d6", "GetBookmarkedElementStacks": "97e44398e5f1ae9efb9f4b78b58f75b81d2305d9c1ca622c6d09ed263eeda4aa", diff --git a/packages/graphql/src/public/schema.graphql b/packages/graphql/src/public/schema.graphql index 2fea0ed341..6a7e416dff 100644 --- a/packages/graphql/src/public/schema.graphql +++ b/packages/graphql/src/public/schema.graphql @@ -94,6 +94,7 @@ type AnswerCollection { type AnswerCollectionEntry { id: Int! + numSolutionUsages: Int value: String! } diff --git a/packages/graphql/src/public/server.json b/packages/graphql/src/public/server.json index a19862f65b..da9fa01dc7 100644 --- a/packages/graphql/src/public/server.json +++ b/packages/graphql/src/public/server.json @@ -120,7 +120,7 @@ "877f83a65cb320f69a51a5bf243f0d62bb8cce9e4c1d0bcab8cec8dd367bed86": "query GetActiveUserCourses {\n getActiveUserCourses {\n id\n name\n displayName\n color\n pinCode\n isArchived\n isGamificationEnabled\n isGroupCreationEnabled\n description\n startDate\n endDate\n groupDeadlineDate\n createdAt\n updatedAt\n __typename\n }\n}", "bcbe895236bd0027e2db37d5884645cfa3230e90a7ce6de893783c5fdc54fa1b": "query GetActivityAnalytics($activityId: String!) {\n getActivityAnalytics(activityId: $activityId) {\n __typename\n activityName\n activityType\n courseParticipants\n instanceQuizAnalytics {\n __typename\n id\n elementName\n elementType\n numberOfAnswers\n uniqueParticipants\n averageTimeSpent\n firstErrorRate\n firstPartialRate\n firstCorrectRate\n lastErrorRate\n lastPartialRate\n lastCorrectRate\n totalErrorRate\n totalPartialRate\n totalCorrectRate\n upvoteRate\n downvoteRate\n feedbackCount\n }\n activityQuizAnalytics {\n __typename\n id\n numberOfAnswers\n averageTimeSpent\n firstErrorRate\n firstPartialRate\n firstCorrectRate\n lastErrorRate\n lastPartialRate\n lastCorrectRate\n totalErrorRate\n totalPartialRate\n totalCorrectRate\n }\n }\n}", "7cbf90cbf98dc1ab0d35d0f134e9fdb46b1b2686fb66d8be31815b451bb083dc": "query GetAnswerCollectionSelection {\n getAnswerCollectionSelection {\n id\n name\n access\n description\n ownerShortname\n entries {\n id\n value\n __typename\n }\n __typename\n }\n}", - "ca781774282830f11ab5aa1f0edd036fb694c52ec5ab27b410dac8f578267668": "query GetAnswerCollections {\n getAnswerCollections {\n answerCollections {\n id\n name\n access\n description\n numSharedUsers\n entries {\n id\n value\n __typename\n }\n __typename\n }\n sharedCollections {\n id\n name\n access\n description\n ownerShortname\n entries {\n id\n value\n __typename\n }\n __typename\n }\n requestedCollections {\n id\n name\n access\n description\n ownerShortname\n __typename\n }\n __typename\n }\n}", + "85b9a7a98c76c5b7653021cd0d901a0c4446780622715563904bed529eb56bf5": "query GetAnswerCollections {\n getAnswerCollections {\n answerCollections {\n id\n name\n access\n description\n numSharedUsers\n entries {\n id\n value\n numSolutionUsages\n __typename\n }\n __typename\n }\n sharedCollections {\n id\n name\n access\n description\n ownerShortname\n entries {\n id\n value\n __typename\n }\n __typename\n }\n requestedCollections {\n id\n name\n access\n description\n ownerShortname\n __typename\n }\n __typename\n }\n}", "af867c3f5673d1ccdab5912713886d47189c6c8cc393c8b46f58dc75cdff654b": "fragment ElementData on ElementInstance {\n elementData {\n ... on ChoicesElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n options {\n hasSampleSolution\n displayMode\n choices {\n ix\n correct\n feedback\n value\n __typename\n }\n __typename\n }\n }\n ... on NumericalElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n options {\n hasSampleSolution\n accuracy\n placeholder\n unit\n restrictions {\n min\n max\n __typename\n }\n solutionRanges {\n min\n max\n __typename\n }\n exactSolutions\n __typename\n }\n }\n ... on FreeTextElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n options {\n hasSampleSolution\n restrictions {\n maxLength\n __typename\n }\n solutions\n __typename\n }\n }\n ... on FlashcardElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n }\n ... on ContentElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n }\n __typename\n }\n __typename\n}\nquery GetArtificialInstance($elementId: Int!) {\n artificialInstance(elementId: $elementId) {\n id\n type\n elementType\n ...ElementData\n __typename\n }\n}", "14169116abd9278adb08977b9c153403e6065ab0c3d02a6beb38017e1c8b19d6": "query GetBasicCourseInformation($courseId: String!) {\n basicCourseInformation(courseId: $courseId) {\n id\n displayName\n description\n color\n owner {\n shortname\n __typename\n }\n __typename\n }\n}", "97e44398e5f1ae9efb9f4b78b58f75b81d2305d9c1ca622c6d09ed263eeda4aa": "fragment ElementDataWithoutSolutions on ElementInstance {\n elementData {\n ... on ChoicesElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n options {\n displayMode\n choices {\n ix\n value\n __typename\n }\n __typename\n }\n }\n ... on NumericalElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n options {\n accuracy\n placeholder\n unit\n restrictions {\n min\n max\n __typename\n }\n __typename\n }\n }\n ... on FreeTextElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n options {\n restrictions {\n maxLength\n __typename\n }\n __typename\n }\n }\n ... on FlashcardElementData {\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n __typename\n }\n ... on ContentElementData {\n __typename\n id\n elementId\n name\n type\n content\n explanation\n pointsMultiplier\n }\n __typename\n }\n __typename\n}\nquery GetBookmarkedElementStacks($courseId: String!) {\n getBookmarkedElementStacks(courseId: $courseId) {\n id\n displayName\n description\n order\n elements {\n id\n type\n elementType\n ...ElementDataWithoutSolutions\n __typename\n }\n __typename\n }\n}", diff --git a/packages/graphql/src/schema/resource.ts b/packages/graphql/src/schema/resource.ts index 0d1d03fa75..d2ff3c3e76 100644 --- a/packages/graphql/src/schema/resource.ts +++ b/packages/graphql/src/schema/resource.ts @@ -8,12 +8,17 @@ export const CollectionAccess = builder.enumType('CollectionAccess', { // ----- ANSWER COLLECTIONS ----- // #region +interface IAnswerCollectionEntry extends DB.AnswerCollectionEntry { + numSolutionUsages?: number +} + export const AnswerCollectionEntryRef = - builder.objectRef('AnswerCollectionEntry') + builder.objectRef('AnswerCollectionEntry') export const AnswerCollectionEntry = AnswerCollectionEntryRef.implement({ fields: (t) => ({ id: t.exposeInt('id'), value: t.exposeString('value'), + numSolutionUsages: t.exposeInt('numSolutionUsages', { nullable: true }), }), }) diff --git a/packages/graphql/src/services/resources.ts b/packages/graphql/src/services/resources.ts index bf2dbbddf5..e85ef01b1b 100644 --- a/packages/graphql/src/services/resources.ts +++ b/packages/graphql/src/services/resources.ts @@ -68,6 +68,13 @@ export async function getAnswerCollections(ctx: ContextWithUser) { answerCollections: { include: { entries: { + include: { + _count: { + select: { + solutionUsages: true, + }, + }, + }, orderBy: { value: 'asc', }, @@ -121,6 +128,10 @@ export async function getAnswerCollections(ctx: ContextWithUser) { return { answerCollections: user.answerCollections.map((collection) => ({ ...collection, + entries: collection.entries.map((entry) => ({ + ...entry, + numSolutionUsages: entry._count?.solutionUsages, + })), numSharedUsers: collection._count?.accessGranted, })), sharedCollections: user.sharedCollections.map((collection) => ({ diff --git a/packages/i18n/messages/de.ts b/packages/i18n/messages/de.ts index 82707a9b36..29b0537842 100644 --- a/packages/i18n/messages/de.ts +++ b/packages/i18n/messages/de.ts @@ -246,6 +246,7 @@ export default { user: 'Nutzer', correctness: 'Korrektheit', answerCollection: 'Antwort-Sammlung', + users: 'Nutzer', }, contentInput: { boldStyle: @@ -1855,6 +1856,8 @@ Da die KlickerUZH-App noch nicht im iOS-App-Store verfügbar ist, folgen Sie die 'Hier finden Sie alle Ihre Antwort-Sammlungen. Sie benötigen diese zur Erstellung bestimmter komplexer Fragetypen, wie beispielsweise Auswahl-Fragen und Fallstudien. Zusätzlich können Sie hier öffentliche Antwort-Sammlungen anderer Nutzer importieren bzw. Zugriff auf diese anfragen.', newAnswerCollection: 'Neue Antwort-Sammlung', addSharedAnswerCollection: 'Geteilte Antwort-Sammlung hinzufügen', + answerOptionUsedAsSolution: + 'Antwort-Optionen, welche mit dem Warnsymbold gekennzeichnet sind, werden bereits in einer Frage als korrekte Lösung verwendet, beachten Sie dies bitte beim Bearbeiten der Antwort. Die Option kann nicht mehr gelöscht werden.', name: 'Name', nameTooltip: 'Wählen Sie einen Namen für Ihre Antwort-Sammlung, damit diese bei der Elementerstellung oder als geteilte Sammlung identifiziert werden kann. Der Name wird den Studierenden nicht angezeigt.', diff --git a/packages/i18n/messages/en.ts b/packages/i18n/messages/en.ts index 82e95175be..35b02df09d 100644 --- a/packages/i18n/messages/en.ts +++ b/packages/i18n/messages/en.ts @@ -245,6 +245,7 @@ export default { user: 'User', correctness: 'Correctness', answerCollection: 'Answer Collection', + users: 'Users', }, contentInput: { boldStyle: @@ -1841,6 +1842,8 @@ Since the KlickerUZH app is not yet available on the iOS App Store, follow these 'Here you can find all your answer collections. You need these to create certain complex question types, such as selection questions and case studies. Additionally, you can import public answer collections from other users or request access to them.', newAnswerCollection: 'New Answer Collection', addSharedAnswerCollection: 'Add Shared Answer Collection', + answerOptionUsedAsSolution: + 'Answer options marked with the warning symbol are already used as correct solutions in a question, please keep this in mind when editing the answer. The option cannot be deleted anymore.', name: 'Name', nameTooltip: 'Choose a name for your answer collection so it can be identified when creating elements or as a shared collection. The name will not be shown to students.',