Skip to content

Commit 4707be7

Browse files
Merge pull request #2413 from adaptlearning/release/crossframeworkimport
0.10.0 Cross framework import release
2 parents af8e8d5 + 75759f7 commit 4707be7

36 files changed

Lines changed: 871 additions & 313 deletions

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,24 @@ All notable changes to the Adapt authoring tool are documented in this file.
55
**IMPORTANT**: For information on how to **correctly and safely** update your installation, please consult **INSTALL.md**.<br/>
66
_Note that we adhere to the [semantic versioning](http://semver.org/) scheme for release numbering._
77

8+
## [0.10.0] - 2019-08-29
9+
10+
Adds ability to import courses with an older framework version, and latest bugfixes.
11+
12+
### Fixed
13+
- Improve error messages when saving theme preset names ([#2382](https://github.com/adaptlearning/adapt_authoring/issues/2382))
14+
- Theme preset dropdown keeps reverting to 'No preset' ([#2379](https://github.com/adaptlearning/adapt_authoring/issues/2379))
15+
- Manage theme preset button wraps onto second line ([#2361](https://github.com/adaptlearning/adapt_authoring/issues/2361))
16+
- Sometimes a theme is wrongly identified as being editable ([#2360](https://github.com/adaptlearning/adapt_authoring/issues/2360))
17+
- Absolute pikaday path breaks grunt build in some cases ([#2314](https://github.com/adaptlearning/adapt_authoring/issues/2314))
18+
- Course creators cannot see asset tags list ([#2306](https://github.com/adaptlearning/adapt_authoring/issues/2306))
19+
- Upload files not always cleared from tmp ([#2115](https://github.com/adaptlearning/adapt_authoring/issues/2115))
20+
- When 'Add component' is clicked move focus to component search ([#1963](https://github.com/adaptlearning/adapt_authoring/issues/1963))
21+
- Allow for pages without a sidebar ([#1541](https://github.com/adaptlearning/adapt_authoring/issues/1541))
22+
23+
### Added
24+
- Ability to import a course with an older framework version ([#2288](https://github.com/adaptlearning/adapt_authoring/issues/2288))
25+
826
## [0.9.0] - 2019-07-15
927

1028
Adds ability to remove plugins, removes unused user roles and latest bugfixes.
@@ -622,6 +640,7 @@ Initial release.
622640
- Loading screen of death
623641
- Session cookie security issues
624642

643+
[0.10.0]: https://github.com/adaptlearning/adapt_authoring/compare/v0.9.0...v0.10.0
625644
[0.9.0]: https://github.com/adaptlearning/adapt_authoring/compare/v0.8.1...v0.9.0
626645
[0.8.1]: https://github.com/adaptlearning/adapt_authoring/compare/v0.8.0...v0.8.1
627646
[0.8.0]: https://github.com/adaptlearning/adapt_authoring/compare/v0.7.1...v0.8.0

frontend/src/modules/editor/contentObject/views/editorPageComponentListView.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ define(function(require) {
6868
this.$el.css({ right:this.$('.editor-component-list-sidebar')
6969
.width()*-1})
7070
.velocity({ right: 0 }, {duration: 400, easing: 'easeOutQuart'});
71+
72+
this.$('.editor-component-list-sidebar-search-field input').focus();
7173
},
7274

7375
closeView: function() {

frontend/src/modules/editor/themeEditor/less/editorPresetEdit.less

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444

4545
.nameEdit {
4646
display: none;
47+
48+
.preset-error {
49+
color: red;
50+
}
4751
}
4852

4953
.label,

frontend/src/modules/editor/themeEditor/less/editorTheming.less

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@
4848
min-width: 150px;
4949
}
5050
}
51+
52+
&.show-preset-select {
53+
select {
54+
width: 180px;
55+
}
56+
}
5157
.edit.btn.secondary {
5258
display: inline-block;
5359
padding: 7px;

frontend/src/modules/editor/themeEditor/templates/editorPresetEdit.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
</button>
1616
</div>
1717
<div class="nameEdit">
18+
<div class="preset-error display-none"></div>
1819
<input type="text" value="{{attributes.displayName}}">
1920
<button class="button save btn secondary">
2021
{{t 'app.themepresetsave'}}

frontend/src/modules/editor/themeEditor/views/editorPresetEditView.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ define(function(require) {
5151
// look out for injection attacks
5252
var newValue = Helpers.escapeText($('input', $preset).val());
5353

54+
if (newValue === '') {
55+
$preset.find('.preset-error').text(Origin.l10n.t('app.required')).removeClass('display-none');
56+
return;
57+
}
58+
59+
var theme = $('.theme select').val();
60+
var presets = this.model.get('presets').where({ parentTheme: theme, displayName: newValue });
61+
if (presets.length > 0) {
62+
$preset.find('.preset-error').text(Origin.l10n.t('app.duplicatepreseterror')).removeClass('display-none');
63+
return;
64+
}
65+
5466
Origin.trigger('managePresets:edit', {
5567
oldValue: $preset.attr('data-name'),
5668
newValue: newValue
@@ -60,6 +72,7 @@ define(function(require) {
6072
onCancelClicked: function(event) {
6173
event && event.preventDefault();
6274
var $preset = $(event.currentTarget).closest('.preset');
75+
$preset.find('.preset-error').addClass('display-none');
6376
$('.nameEdit', $preset).hide();
6477
$('.name', $preset).show();
6578
},

frontend/src/modules/editor/themeEditor/views/editorThemingView.js

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,14 @@ define(function(require) {
6262
var selectedTheme = this.getSelectedTheme();
6363

6464
if (!this.themeIsEditable(selectedTheme)) {
65+
this.$('.theme-selector').removeClass('show-preset-select');
6566
this.$('.empty-message').show();
6667
this.$('.editable-theme').hide();
6768
$('.editor-theming-sidebar-reset').hide();
6869
return;
6970
}
7071

72+
this.$('.theme-selector').addClass('show-preset-select');
7173
this.$('.empty-message').hide();
7274
this.$('.editable-theme').show();
7375
$('.editor-theming-sidebar-reset').show();
@@ -417,19 +419,8 @@ define(function(require) {
417419

418420
themeIsEditable: function(theme) {
419421
var props = theme && theme.get('properties');
420-
if (!props) {
421-
return false;
422-
}
423-
if (Object.keys(props).length === 1) {
424-
if (props.hasOwnProperty('pluginLocations')) {
425-
return false;
426-
}
427-
// For old themes
428-
if (props.hasOwnProperty('_screenSize')) {
429-
return false;
430-
}
431-
}
432-
return true;
422+
423+
return props && props.variables;
433424
},
434425

435426
flattenNestedProperties: function(properties) {
@@ -538,14 +529,16 @@ define(function(require) {
538529
text: Origin.l10n.t('app.presetinputtext'),
539530
closeOnConfirm: false,
540531
showCancelButton: true,
541-
callback: function() {
532+
callback: function(presetName) {
533+
if (presetName === false) return;
534+
if (presetName === "") return swal.showInputError(Origin.l10n.t('app.invalidempty'));
542535
var theme = self.$('.theme select').val();
543-
var presets = self.presets.where({ parentTheme: theme, displayName: arguments[0] });
536+
var presets = self.presets.where({ parentTheme: theme, displayName: presetName });
544537
if (presets.length > 0) {
545538
swal.showInputError(Origin.l10n.t('app.duplicatepreseterror'));
546539
} else {
547540
// watch out for injection attacks
548-
self.savePreset(Helpers.escapeText(arguments[0]));
541+
self.savePreset(Helpers.escapeText(presetName));
549542
swal.close();
550543
}
551544
}

frontend/src/modules/frameworkImport/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ define(function(require) {
1212
Origin.permissions.addRoute('frameworkImport', data.featurePermissions);
1313
});
1414

15-
Origin.on('router:frameworkImport', function(location, subLocation, action) {
15+
Origin.on('router:frameworkImport', function() {
1616
Origin.contentPane.setView(FrameworkImportView, { model: new Backbone.Model({ globalData: data }) });
1717
Origin.sidebar.addView(new FrameworkImportSidebarView().$el);
1818
});

frontend/src/modules/frameworkImport/less/frameworkImport.less

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
@import 'colours';
22
@import 'sharedStyles';
3+
@framework-import-red: #ff3343;
4+
@framework-import-amber: #ffa340;
5+
@framework-import-green: @secondary-color;
36

47
.frameworkImport .inner {
58
.form-container-style;
@@ -26,6 +29,15 @@
2629
}
2730
}
2831

32+
.col-row {
33+
display: flex;
34+
align-items: center;
35+
}
36+
37+
.tb-row .tb-col-inner {
38+
padding: 0;
39+
}
40+
2941
li {
3042
margin-left: 0;
3143
list-style: none;
@@ -43,4 +55,62 @@
4355
padding-bottom: 5px;
4456
}
4557
}
58+
59+
&.import-summary {
60+
.title {
61+
padding-bottom: 10px;
62+
color: @primary-color;
63+
64+
&.red {
65+
color: @framework-import-red;
66+
}
67+
68+
&.amber {
69+
color: @framework-import-amber;
70+
}
71+
72+
&.green {
73+
color: @framework-import-green;
74+
}
75+
}
76+
.description {
77+
font-weight: @font-weight-bold;
78+
}
79+
}
80+
81+
&.plugin-list {
82+
.red {
83+
.status, .key {
84+
color: @framework-import-red;
85+
}
86+
}
87+
88+
.amber {
89+
.status, .key {
90+
color: @framework-import-amber;
91+
}
92+
93+
.at-version {
94+
font-weight: @font-weight-bold;
95+
}
96+
}
97+
98+
.green-install, .green-update {
99+
.status, .key {
100+
color: @framework-import-green;
101+
}
102+
103+
.import-version {
104+
font-weight: @font-weight-bold;
105+
}
106+
}
107+
108+
.status, .key {
109+
font-weight: @font-weight-bold;
110+
}
111+
112+
.key-field {
113+
margin-bottom: 5px;
114+
}
115+
}
46116
}
Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,58 @@
1-
<div class="inner">
2-
<form class="frameworkImport forms" action="importsource" method="post" autocomplete="off">
3-
<div class="form-group">
4-
<div class="field field-file">
5-
<label for="file">
6-
{{t 'app.assetfile'}} <span class="req">*</span>
7-
<span class="error"></span>
8-
</label>
9-
<div class="field-help">
10-
{{t 'app.importframeworkinstruction'}}
11-
</div>
12-
{{#if path}}
13-
<div class="asset-management-new-asset-file">
14-
{{t 'app.importframeworkfileuploaded'}}
15-
</div>
16-
{{else}}
17-
<input type="file" class="asset-file" name="file">
18-
{{maxUploadSize}}
19-
<div class="progress-container">
20-
<div class="progress-bar">
21-
<div class="progress-percent">0%</div>
22-
</div>
1+
<div id="import_upload" class="inner">
2+
<form class="frameworkImport forms" action="importsourcecheck" method="post" autocomplete="off">
3+
<div class="form-group">
4+
<div class="field field-file">
5+
<label for="file">
6+
{{t 'app.assetfile'}} <span class="req">*</span>
7+
<span class="error"></span>
8+
</label>
9+
<div class="field-help">
10+
{{t 'app.importframeworkinstruction'}}
11+
</div>
12+
{{#if path}}
13+
<div class="asset-management-new-asset-file">
14+
{{t 'app.importframeworkfileuploaded'}}
15+
</div>
16+
{{else}}
17+
<input type="file" class="asset-file" name="file">
18+
{{maxUploadSize}}
19+
<div class="progress-container">
20+
<div class="progress-bar">
21+
<div class="progress-percent">0%</div>
2322
</div>
24-
{{/if}}
2523
</div>
26-
<div class="field field-assets">
27-
<label for="tags">{{t 'app.importassetfolderstitle'}}</label>
28-
<div class="field-help">
29-
{{t 'app.importassetfoldersinstruction'}}
30-
</div>
31-
<div>
32-
<input type="text" autocomplete="off" class="width-30" id="formAssetFolders" name="formAssetFolders" placeholder="{{t 'app.importassetfoldersplaceholder'}}" value="" />
33-
</div>
24+
{{/if}}
25+
</div>
26+
<div class="field field-assets">
27+
<label for="tags">{{t 'app.importassetfolderstitle'}}</label>
28+
<div class="field-help">
29+
{{t 'app.importassetfoldersinstruction'}}
3430
</div>
35-
<div class="field field-tags">
36-
<label for="tags">{{t 'app.tags'}}</label>
37-
<input type="text" autocomplete="off" class="width-30" id="tags_control" name="tags_control" value="{{pickCSV tags "title"}}" />
31+
<div>
32+
<input type="text" autocomplete="off" class="width-30" id="formAssetFolders" name="formAssetFolders" placeholder="{{t 'app.importassetfoldersplaceholder'}}" value="" />
3833
</div>
39-
<input type="hidden" name="tags" id="tags" />
4034
</div>
35+
<div class="field field-tags">
36+
<label for="tags">{{t 'app.tags'}}</label>
37+
<input type="text" autocomplete="off" class="width-30" id="tags_control" name="tags_control" value="{{pickCSV tags "title"}}" />
38+
</div>
39+
<input type="hidden" name="tags" id="tags" />
40+
</div>
41+
</form>
42+
</div>
43+
44+
<div id="import_details" class="display-none">
45+
<form class="frameworkImportDetails forms" action="importsource" method="post" autocomplete="off">
46+
<div class="inner framework-versions display-none"></div>
47+
<div class="inner import-summary">
48+
<div class="title"></div>
49+
<div class="description"></div>
50+
</div>
51+
<div class="inner plugin-list display-none">
52+
<div class="red key-field display-none"><span class="key">{{t 'app.pluginredlabel'}}</span> - {{t 'app.pluginredkey'}}</div>
53+
<div class="amber key-field display-none"><span class="key">{{t 'app.pluginamberlabel'}}</span> - {{t 'app.pluginamberkey'}}</div>
54+
<div class="green-update key-field display-none"><span class="key">{{t 'app.plugingreenupdatelabel'}}</span> - {{t 'app.plugingreenupdatekey'}}</div>
55+
<div class="green-install key-field display-none"><span class="key">{{t 'app.plugingreeninstalllabel'}}</span> - {{t 'app.plugingreeninstallkey'}}</div>
56+
</div>
4157
</form>
4258
</div>

0 commit comments

Comments
 (0)