-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-pin
+
+
+
+ Toggle pinned
+
+
+
+
+
+
+
+
+
+
-
- {{ orderedCourses.length ? '' : 'No courses found.' }}
+
+
+ {{ noRepositoriesMessage }}
+
-
+
diff --git a/client/components/catalog/Create.vue b/client/components/catalog/Create.vue
index 16fdbe767..95152a142 100644
--- a/client/components/catalog/Create.vue
+++ b/client/components/catalog/Create.vue
@@ -3,13 +3,24 @@
v-hotkey="{ esc: hide }"
v-if="isAdmin"
v-model="isVisible"
- width="600px">
-
+ width="700px">
+
mdi-plus
- Create repository
+
+
+ mdi-folder-plus-outline
+
+ New
+
Cancel
-
- Create
-
+ Create
@@ -54,13 +62,13 @@
diff --git a/client/components/catalog/SelectOrder.vue b/client/components/catalog/SelectOrder.vue
new file mode 100644
index 000000000..a271aab92
--- /dev/null
+++ b/client/components/catalog/SelectOrder.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+ mdi-sort
+
+
+
+
+ {{ text }}
+
+
+
+
+
+ mdi-sort-{{ sortBy.order === 'ASC' ? 'ascending' : 'descending' }}
+
+
+
+
+
+
+
+
diff --git a/client/components/common/ActivityBrowser/SelectActivity.vue b/client/components/common/ActivityBrowser/SelectActivity.vue
index 689ce11e4..27fe83ba9 100644
--- a/client/components/common/ActivityBrowser/SelectActivity.vue
+++ b/client/components/common/ActivityBrowser/SelectActivity.vue
@@ -31,14 +31,14 @@
+
+
diff --git a/client/components/common/InputAsset.vue b/client/components/common/InputAsset.vue
index 664ebd241..61a878df8 100644
--- a/client/components/common/InputAsset.vue
+++ b/client/components/common/InputAsset.vue
@@ -11,6 +11,7 @@
mdi-open-in-new
+ :placeholder="allowFileUpload ? 'or paste a URL' : 'Paste a URL'"/>
+
+
+ {{ option.label }}
+
+
+
+ {{ option.label }}
+
diff --git a/client/components/content-elements/tce-html/edit/index.vue b/client/components/content-elements/tce-html/edit/index.vue
index c989b106b..63eb1e940 100644
--- a/client/components/content-elements/tce-html/edit/index.vue
+++ b/client/components/content-elements/tce-html/edit/index.vue
@@ -23,12 +23,13 @@
diff --git a/client/components/course/Outline/reorderMixin.js b/client/components/course/Outline/reorderMixin.js
index 83ba43544..69f445316 100644
--- a/client/components/course/Outline/reorderMixin.js
+++ b/client/components/course/Outline/reorderMixin.js
@@ -1,8 +1,8 @@
-import { mapActions } from 'vuex-module';
+import { mapActions } from 'vuex';
export default {
methods: {
- ...mapActions({ updatePosition: 'reorder' }, 'activities'),
+ ...mapActions('activities', { updatePosition: 'reorder' }),
reorder({ newIndex: newPosition }, items) {
const activity = items[newPosition];
const isFirstChild = newPosition === 0;
diff --git a/client/components/course/Revisions/EntitySidebar.vue b/client/components/course/Revisions/EntitySidebar.vue
index 8e1cc4344..10bad10a3 100644
--- a/client/components/course/Revisions/EntitySidebar.vue
+++ b/client/components/course/Revisions/EntitySidebar.vue
@@ -56,6 +56,11 @@ export default {
diff --git a/client/components/system-settings/Sidebar.vue b/client/components/system-settings/Sidebar.vue
new file mode 100644
index 000000000..c786fe2a9
--- /dev/null
+++ b/client/components/system-settings/Sidebar.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+ mdi-{{ icon }}
+
+ {{ label }}
+
+
+
+
+
+
diff --git a/client/components/system-settings/StructureTypes.vue b/client/components/system-settings/StructureTypes.vue
new file mode 100644
index 000000000..1fc7d18a5
--- /dev/null
+++ b/client/components/system-settings/StructureTypes.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+ {{ open ? 'mdi-folder-open' : 'mdi-folder' }}
+
+
+
+
+
+
+
+
+
diff --git a/client/components/system-settings/UserManagement/UserDialog.vue b/client/components/system-settings/UserManagement/UserDialog.vue
new file mode 100644
index 000000000..4a336a0d5
--- /dev/null
+++ b/client/components/system-settings/UserManagement/UserDialog.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+ {{ userData ? 'Edit' : 'Create' }} User
+
+
+ Reinvite
+
+
+
+
+
+
+
+
+ Cancel
+ Save
+
+
+
+
+
+
+
diff --git a/client/components/system-settings/UserManagement/index.vue b/client/components/system-settings/UserManagement/index.vue
new file mode 100644
index 000000000..1955d0f89
--- /dev/null
+++ b/client/components/system-settings/UserManagement/index.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+ mdi-account-plus-outline
+ Add user
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | {{ item.email }} |
+ {{ item.role }} |
+ {{ item.createdAt | formatDate }} |
+
+
+ mdi-pencil
+
+
+
+ mdi-account-{{ item.deletedAt ? 'convert' : 'off' }}
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/components/system-settings/index.vue b/client/components/system-settings/index.vue
new file mode 100644
index 000000000..a3d595917
--- /dev/null
+++ b/client/components/system-settings/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+ Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/main.js b/client/main.js
index cc8e80654..841b6d45b 100644
--- a/client/main.js
+++ b/client/main.js
@@ -1,3 +1,4 @@
+/* eslint-disable sort-imports */
import '@babel/polyfill';
import 'dom-shims/shim/Element.classList';
import 'dom-shims/shim/Element.mutation';
@@ -8,8 +9,10 @@ import 'vue-directive-tooltip/css/index.css';
import assetsApi from '@/api/asset';
import colors from 'vuetify/es5/util/colors';
import ElementRegistry from './ElementRegistry';
+import fecha from 'fecha';
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';
@@ -17,14 +20,15 @@ import Vue from 'vue';
import VueHotkey from 'v-hotkey';
import Vuetify from 'vuetify';
import VuetifySnackbar from '@/plugins/vuetify-snackbar';
-import { sync } from 'vuex-router-sync';
import store from './store';
import router from './router';
import App from './App';
Vue.component('tce-question-container', QuestionContainer);
-
+Vue.filter('formatDate', (value, dateFormat = 'MM/DD/YY HH:mm') => {
+ return value && fecha.format(new Date(value), dateFormat);
+});
Vue.use(FileFilter);
Vue.use(VueHotkey);
Vue.use(Vuetify, {
@@ -32,6 +36,9 @@ Vue.use(Vuetify, {
theme: {
primary: colors.blueGrey.darken2,
secondary: colors.pink
+ },
+ options: {
+ customProperties: true
}
});
Vue.use(VuetifySnackbar);
diff --git a/client/plugins/vuetify-snackbar/Snackbar.vue b/client/plugins/vuetify-snackbar/Snackbar.vue
index 91736bd29..2360fc00c 100644
--- a/client/plugins/vuetify-snackbar/Snackbar.vue
+++ b/client/plugins/vuetify-snackbar/Snackbar.vue
@@ -8,8 +8,9 @@