diff --git a/client/main.js b/client/main.js index 841b6d45b..05ccc741e 100644 --- a/client/main.js +++ b/client/main.js @@ -4,7 +4,6 @@ import 'dom-shims/shim/Element.classList'; import 'dom-shims/shim/Element.mutation'; import 'event-source-polyfill'; import 'bootstrap-sass/assets/javascripts/bootstrap'; -import 'vue-directive-tooltip/css/index.css'; import assetsApi from '@/api/asset'; import colors from 'vuetify/es5/util/colors'; @@ -14,7 +13,6 @@ import FileFilter from '@/directives/file-filter'; import QuestionContainer from 'tce-core/QuestionContainer'; import { sync } from 'vuex-router-sync'; import Timeago from 'vue-timeago'; -import Tooltip from 'vue-directive-tooltip'; import VeeValidate from './utils/validation'; import Vue from 'vue'; import VueHotkey from 'v-hotkey'; @@ -42,7 +40,6 @@ Vue.use(Vuetify, { } }); Vue.use(VuetifySnackbar); -Vue.use(Tooltip, { delay: 50 }); Vue.use(VeeValidate, { delay: 700, fieldsBagName: 'vFields', diff --git a/package-lock.json b/package-lock.json index 634041aac..fc7242ac8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "tailor", - "version": "3.2.0", + "version": "3.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -18711,14 +18711,6 @@ "resolved": "https://registry.npmjs.org/vue-datetime/-/vue-datetime-1.0.0-beta.10.tgz", "integrity": "sha512-/wJkj95JSzWqH0Ja4JpXX6I+fXo2A34GCtsx00vR5RjNxk3++93rg7G4ZlI3MFo807zH9bIxXfIohbAZgnAWbQ==" }, - "vue-directive-tooltip": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/vue-directive-tooltip/-/vue-directive-tooltip-1.5.1.tgz", - "integrity": "sha512-2v16flWOSM2gp/pNLje29lJXmWq4ib0NjoAn4wY5R1pYzy0S9a/q3dhQ7dgoqQ1ePXYOj3EpZxMVO8AQ1Zod/A==", - "requires": { - "popper.js": "1.12.5" - } - }, "vue-eslint-parser": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz", @@ -18841,7 +18833,7 @@ "vue-video-player": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/vue-video-player/-/vue-video-player-3.1.4.tgz", - "integrity": "sha1-cAmwbc7EObPqZFGDIX0xTL8NN/0=", + "integrity": "sha512-CqVvhy2QSDRxXfaHn029Cpz+mbV2gubIcdZE5Uu1e7f0ZfpdqpuqnSYyE50nUXzM3zfa7TaYOARpLsY3FdLtOQ==", "requires": { "video.js": "^5.11.7" } diff --git a/package.json b/package.json index 6718880f9..805e5c17c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tailor", - "version": "3.2.0", + "version": "3.2.1", "codename": "silk", "description": "Content authoring platform", "author": "ExtensionEngine ", @@ -122,7 +122,6 @@ "vue-avatar": "^2.1.1", "vue-color": "^2.7.0", "vue-datetime": "^1.0.0-beta.3", - "vue-directive-tooltip": "^1.4.2", "vue-focus": "^2.1.0", "vue-infinite-loading": "^2.4.4", "vue-infinite-scroll": "^2.0.0", diff --git a/server/activity/activity.controller.js b/server/activity/activity.controller.js index 44f305f9b..80c4d0215 100644 --- a/server/activity/activity.controller.js +++ b/server/activity/activity.controller.js @@ -63,9 +63,13 @@ function clone({ activity, body }, res) { } function getPreviewUrl({ course, activity }, res) { - return fetchActivityContent(course, activity) + return fetchActivityContent(course, activity, true) .then(content => { - const body = { uid: activity.uid, ...content }; + const body = { + ...pick(activity, ['id', 'uid', 'type']), + meta: activity.data, + ...content + }; return request.post(previewUrl, body); }) .then(({ data: { url } }) => { diff --git a/server/shared/publishing/helpers.js b/server/shared/publishing/helpers.js index ed5ff41eb..362a15acc 100644 --- a/server/shared/publishing/helpers.js +++ b/server/shared/publishing/helpers.js @@ -1,11 +1,10 @@ 'use strict'; -const { getLevelRelationships } = require('../../../config/shared/activities'); -const { TeachingElement } = require('../database'); const filter = require('lodash/filter'); const find = require('lodash/find'); const findIndex = require('lodash/findIndex'); const get = require('lodash/get'); +const { getLevelRelationships } = require('../../../config/shared/activities'); const hash = require('hash-obj'); const keys = require('lodash/keys'); const map = require('lodash/map'); @@ -13,7 +12,9 @@ const omit = require('lodash/omit'); const pick = require('lodash/pick'); const Promise = require('bluebird'); const reduce = require('lodash/reduce'); +const { resolveStatics } = require('../storage/helpers'); const storage = require('../storage'); +const { TeachingElement } = require('../database'); const without = require('lodash/without'); const { FLAT_REPO_STRUCTURE } = process.env; @@ -100,12 +101,17 @@ function getPublishedStructure(repository) { }); } -function fetchActivityContent(repository, activity) { - return Promise.all([ +async function fetchActivityContent(repository, activity, signed = false) { + const res = await Promise.all([ fetchContainers(repository, activity), fetchAssessments(activity), fetchExams(activity) ]).spread((containers, assessments, exams) => ({ containers, assessments, exams })); + if (!signed) return res; + res.containers = await Promise.map(res.containers, resolveContainer); + res.assessments = await resolveAssessments(res.assessments); + res.exams = await Promise.map(res.exams, resolveExam); + return res; } function publishContent(repository, activity) { @@ -185,6 +191,24 @@ async function fetchQuestionGroups(exam) { }; } +async function resolveContainer(container) { + container.elements = await Promise.map(container.elements, resolveStatics); + return container; +} + +function resolveAssessments(assessments) { + return Promise.map(assessments, resolveStatics); +} + +async function resolveExam(exam) { + exam.groups = await Promise.map(exam.groups, async group => { + group.intro = await Promise.map(group.intro, resolveStatics); + group.assessments = await Promise.map(group.assessments, resolveStatics); + return group; + }); + return exam; +} + function saveFile(parent, key, data) { const buffer = Buffer.from(JSON.stringify(data), 'utf8'); const baseUrl = getBaseUrl(parent.courseId, parent.id);