pageflow 12.0.4 → 12.1.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of pageflow might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +158 -374
- data/README.md +24 -3
- data/Rakefile +2 -2
- data/admins/pageflow/accounts.rb +30 -4
- data/admins/pageflow/entry.rb +59 -9
- data/admins/pageflow/membership.rb +57 -6
- data/admins/pageflow/user.rb +25 -4
- data/app/assets/images/pageflow/themes/default/preview.png +0 -0
- data/app/assets/images/pageflow/themes/default/preview_thumbnail.png +0 -0
- data/app/assets/javascripts/pageflow/admin/entries.js +5 -3
- data/app/assets/javascripts/pageflow/admin/users.js +33 -0
- data/app/assets/javascripts/pageflow/admin.js +4 -1
- data/app/assets/javascripts/pageflow/audio_context.js +28 -0
- data/app/assets/javascripts/pageflow/audio_player/get_media_element_method.js +5 -0
- data/app/assets/javascripts/pageflow/audio_player.js +2 -0
- data/app/assets/javascripts/pageflow/base.js +4 -22
- data/app/assets/javascripts/pageflow/dist/react.js +323 -242
- data/app/assets/javascripts/pageflow/editor/api/widget_type.js +23 -0
- data/app/assets/javascripts/pageflow/editor/api/widget_types.js +53 -0
- data/app/assets/javascripts/pageflow/editor/api.js +9 -1
- data/app/assets/javascripts/pageflow/editor/base.js +0 -1
- data/app/assets/javascripts/pageflow/editor/collections/pages_collection.js +1 -0
- data/app/assets/javascripts/pageflow/editor/collections/subset_collection.js +21 -1
- data/app/assets/javascripts/pageflow/editor/collections/themes_collection.js +13 -0
- data/app/assets/javascripts/pageflow/editor/collections/widgets_collection.js +23 -8
- data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +7 -1
- data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +10 -3
- data/app/assets/javascripts/pageflow/editor/initializers/setup_widget_types.js +5 -1
- data/app/assets/javascripts/pageflow/editor/initializers/stylesheet_reloading.js +8 -3
- data/app/assets/javascripts/pageflow/editor/models/edit_lock_container.js +1 -1
- data/app/assets/javascripts/pageflow/editor/models/entry.js +7 -4
- data/app/assets/javascripts/pageflow/editor/models/entry_configuration.js +1 -1
- data/app/assets/javascripts/pageflow/editor/models/file_stage.js +1 -0
- data/app/assets/javascripts/pageflow/editor/models/page.js +3 -1
- data/app/assets/javascripts/pageflow/editor/models/preview_entry_data.js +2 -2
- data/app/assets/javascripts/pageflow/editor/models/theme.js +25 -0
- data/app/assets/javascripts/pageflow/editor/models/theming.js +1 -19
- data/app/assets/javascripts/pageflow/editor/models/widget.js +22 -1
- data/app/assets/javascripts/pageflow/editor/models/widget_configuration.js +5 -0
- data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +1 -0
- data/app/assets/javascripts/pageflow/editor/templates/change_theme_dialog.jst.ejs +23 -0
- data/app/assets/javascripts/pageflow/editor/templates/edit_widget.jst.ejs +1 -2
- data/app/assets/javascripts/pageflow/editor/templates/inputs/reference.jst.ejs +2 -2
- data/app/assets/javascripts/pageflow/editor/templates/static_thumbnail.jst.ejs +1 -0
- data/app/assets/javascripts/pageflow/editor/templates/theme_item.jst.ejs +5 -0
- data/app/assets/javascripts/pageflow/editor/templates/widget_item.jst.ejs +3 -0
- data/app/assets/javascripts/pageflow/editor/utils/stylesheet.js +23 -0
- data/app/assets/javascripts/pageflow/editor/views/change_theme_dialog_view.js +76 -0
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +4 -2
- data/app/assets/javascripts/pageflow/editor/views/edit_meta_data_view.js +17 -4
- data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +11 -21
- data/app/assets/javascripts/pageflow/editor/views/edit_widgets_view.js +1 -3
- data/app/assets/javascripts/pageflow/editor/views/file_meta_data_item_value_view.js +10 -1
- data/app/assets/javascripts/pageflow/editor/views/inputs/reference_input_view.js +36 -4
- data/app/assets/javascripts/pageflow/editor/views/inputs/theme_input_view.js +26 -0
- data/app/assets/javascripts/pageflow/editor/views/model_thumbnail_view.js +28 -14
- data/app/assets/javascripts/pageflow/editor/views/static_thumbnail_view.js +20 -0
- data/app/assets/javascripts/pageflow/editor/views/theme_item_view.js +41 -0
- data/app/assets/javascripts/pageflow/editor/views/widget_item_view.js +49 -0
- data/app/assets/javascripts/pageflow/history.js +7 -1
- data/app/assets/javascripts/pageflow/media_player/volume_fading/interval.js +65 -0
- data/app/assets/javascripts/pageflow/media_player/volume_fading/noop.js +5 -0
- data/app/assets/javascripts/pageflow/media_player/volume_fading/web_audio.js +109 -0
- data/app/assets/javascripts/pageflow/media_player/volume_fading.js +14 -65
- data/app/assets/javascripts/pageflow/slideshow/dom_order_scroll_navigator.js +5 -2
- data/app/assets/javascripts/pageflow/slideshow.js +19 -8
- data/app/assets/javascripts/pageflow/ui/views/configuration_editor_view.js +4 -0
- data/app/assets/javascripts/pageflow/ui/views/inputs/text_area_input_view.js +10 -5
- data/app/assets/javascripts/pageflow/ui/views/inputs/text_input_view.js +4 -48
- data/app/assets/javascripts/pageflow/ui/views/mixins/input_with_placeholder_text.js +58 -0
- data/app/assets/javascripts/pageflow/vendor.js +16 -0
- data/app/assets/javascripts/pageflow/video_player/get_media_element_method.js +6 -0
- data/app/assets/javascripts/pageflow/video_player.js +2 -0
- data/app/assets/stylesheets/pageflow/admin/entries.scss +1 -1
- data/app/assets/stylesheets/pageflow/admin/quotas.scss +1 -1
- data/app/assets/stylesheets/pageflow/admin.scss +2 -0
- data/app/assets/stylesheets/pageflow/base.scss +0 -1
- data/app/assets/stylesheets/pageflow/editor/base.scss +2 -0
- data/app/assets/stylesheets/pageflow/editor/change_theme.scss +114 -0
- data/app/assets/stylesheets/pageflow/editor/static_thumbnails.scss +4 -0
- data/app/assets/stylesheets/pageflow/editor/widgets.scss +26 -2
- data/app/assets/stylesheets/pageflow/page.scss +1 -14
- data/app/assets/stylesheets/pageflow/themes/default/indicators.scss +12 -0
- data/app/assets/stylesheets/pageflow/themes/default/loading_spinner.scss +11 -0
- data/app/assets/stylesheets/pageflow/themes/default/logo/alignment.scss +27 -0
- data/app/assets/stylesheets/pageflow/themes/default/logo/variant/background_image.scss +20 -2
- data/app/assets/stylesheets/pageflow/themes/default/logo/variant/watermark.scss +4 -1
- data/app/assets/stylesheets/pageflow/themes/default/page/line_lengths.scss +113 -0
- data/app/assets/stylesheets/pageflow/themes/default/page.scss +1 -0
- data/app/controllers/pageflow/editor/widgets_controller.rb +15 -1
- data/app/controllers/pageflow/entries_controller.rb +1 -1
- data/app/helpers/pageflow/admin/entries_helper.rb +0 -9
- data/app/helpers/pageflow/admin/memberships_helper.rb +43 -123
- data/app/helpers/pageflow/admin/users_helper.rb +15 -0
- data/app/helpers/pageflow/entries_helper.rb +3 -1
- data/app/helpers/pageflow/entry_json_seed_helper.rb +9 -3
- data/app/helpers/pageflow/public_i18n_helper.rb +2 -2
- data/app/helpers/pageflow/quota_helper.rb +2 -2
- data/app/helpers/pageflow/social_share_helper.rb +3 -2
- data/app/helpers/pageflow/themes_helper.rb +11 -3
- data/app/helpers/pageflow/widgets_helper.rb +10 -2
- data/app/jobs/pageflow/prune_auto_snapshots_job.rb +9 -0
- data/app/mailers/pageflow/user_mailer.rb +11 -1
- data/app/models/concerns/pageflow/feature_target.rb +1 -1
- data/app/models/concerns/pageflow/hosted_file.rb +9 -0
- data/app/models/concerns/pageflow/output_source.rb +2 -1
- data/app/models/concerns/pageflow/serialization_blacklist.rb +19 -0
- data/app/models/concerns/pageflow/serialized_configuration.rb +17 -0
- data/app/models/concerns/pageflow/theme_referencer.rb +23 -0
- data/app/models/pageflow/account.rb +6 -1
- data/app/models/pageflow/account_member_query.rb +6 -12
- data/app/models/pageflow/account_role_query.rb +68 -0
- data/app/models/pageflow/application_query.rb +13 -0
- data/app/models/pageflow/application_record.rb +5 -0
- data/app/models/pageflow/audio_file.rb +1 -1
- data/app/models/pageflow/auto_snapshot_pruning.rb +26 -0
- data/app/models/pageflow/chapter.rb +4 -8
- data/app/models/pageflow/draft_entry.rb +2 -1
- data/app/models/pageflow/edit_lock.rb +11 -5
- data/app/models/pageflow/encoding_confirmation.rb +2 -1
- data/app/models/pageflow/entry.rb +13 -2
- data/app/models/pageflow/entry_publication.rb +2 -0
- data/app/models/pageflow/entry_role_query.rb +24 -9
- data/app/models/pageflow/entry_title_or_account_name_query.rb +33 -0
- data/app/models/pageflow/file_usage.rb +3 -7
- data/app/models/pageflow/folder.rb +1 -1
- data/app/models/pageflow/home_button.rb +1 -1
- data/app/models/pageflow/image_file.rb +22 -4
- data/app/models/pageflow/invitation_form.rb +10 -4
- data/app/models/pageflow/managed_user_query.rb +44 -0
- data/app/models/pageflow/membership.rb +1 -1
- data/app/models/pageflow/overview_button.rb +3 -4
- data/app/models/pageflow/page.rb +3 -7
- data/app/models/pageflow/potential_memberships.rb +112 -0
- data/app/models/pageflow/published_entry.rb +2 -1
- data/app/models/pageflow/revision.rb +13 -4
- data/app/models/pageflow/storyline.rb +3 -4
- data/app/models/pageflow/text_track_file.rb +1 -1
- data/app/models/pageflow/theming.rb +15 -10
- data/app/models/pageflow/url_template.rb +8 -2
- data/app/models/pageflow/user_name_query.rb +30 -0
- data/app/models/pageflow/video_file.rb +5 -1
- data/app/models/pageflow/widget.rb +3 -1
- data/app/models/pageflow/zencoder_attachment.rb +16 -5
- data/app/policies/pageflow/account_policy.rb +31 -61
- data/app/policies/pageflow/application_policy.rb +6 -0
- data/app/policies/pageflow/entry_policy.rb +11 -3
- data/app/policies/pageflow/membership_policy.rb +1 -2
- data/app/policies/pageflow/user_policy.rb +20 -1
- data/app/views/admin/accounts/_form.html.erb +4 -4
- data/app/views/admin/accounts/_theming_defaults_inline_help.html.erb +5 -0
- data/app/views/admin/memberships/_form.html.erb +9 -14
- data/app/views/admin/memberships/_role_hint.html.arb +1 -1
- data/app/views/admin/users/invitation.html.erb +18 -9
- data/app/views/admin/users/me.html.erb +2 -2
- data/app/views/admin/users/quota_state.html.erb +1 -0
- data/app/views/components/pageflow/admin/add_membership_button.rb +81 -0
- data/app/views/components/pageflow/admin/members_tab.rb +6 -4
- data/app/views/components/pageflow/admin/revisions_tab.rb +16 -4
- data/app/views/components/pageflow/admin/user_accounts_tab.rb +8 -2
- data/app/views/components/pageflow/admin/user_entries_tab.rb +6 -2
- data/app/views/components/pageflow/admin/users_tab.rb +9 -5
- data/app/views/layouts/pageflow/application.html.erb +2 -1
- data/app/views/pageflow/admin/users/_quota_exhausted.html.erb +1 -0
- data/app/views/pageflow/admin/users/_quota_state.html.erb +7 -0
- data/app/views/pageflow/config/_editor_seeds.json.jbuilder +2 -0
- data/app/views/pageflow/editor/entries/_entry.json.jbuilder +1 -0
- data/app/views/pageflow/editor/entries/seed.json.erb +3 -1
- data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -1
- data/app/views/pageflow/editor/themings/_theming.json.jbuilder +0 -7
- data/app/views/pageflow/editor/widgets/_widget.json.jbuilder +1 -1
- data/app/views/pageflow/entries/_entry.html.erb +5 -5
- data/app/views/pageflow/entries/edit.html.erb +1 -1
- data/app/views/pageflow/entries/show.html.erb +1 -1
- data/app/views/pageflow/entry_json_seed/_entry.json.jbuilder +1 -0
- data/app/views/pageflow/themes/_theme.json.jbuilder +13 -0
- data/config/initializers/admin_resource_tabs.rb +19 -6
- data/config/initializers/features.rb +1 -0
- data/config/locales/de.yml +26 -3
- data/config/locales/en.yml +26 -3
- data/db/migrate/20170201074328_add_configuration_to_widgets.rb +5 -0
- data/db/migrate/20170222124848_update_video_file_output_presences.rb +1 -1
- data/db/migrate/20170315130000_add_theme_name_to_revisions.rb +12 -0
- data/db/migrate/20170912165050_reset_copied_snapshot_type.rb +24 -0
- data/lib/generators/pageflow/routes/routes_generator.rb +11 -1
- data/lib/generators/pageflow/seeds/seeds_generator.rb +5 -0
- data/lib/generators/pageflow/seeds/templates/seeds.rb +5 -3
- data/lib/generators/pageflow/theme/templates/preview.png +0 -0
- data/lib/generators/pageflow/theme/templates/preview_thumbnail.png +0 -0
- data/lib/generators/pageflow/theme/theme_generator.rb +3 -0
- data/lib/pageflow/ability_mixin.rb +27 -6
- data/lib/pageflow/active_admin_can_can_fix.rb +34 -0
- data/lib/pageflow/configuration/permissions.rb +27 -0
- data/lib/pageflow/configuration.rb +28 -0
- data/lib/pageflow/engine.rb +25 -19
- data/lib/pageflow/images/palette.png +0 -0
- data/lib/pageflow/seeds.rb +1 -1
- data/lib/pageflow/theme.rb +8 -0
- data/lib/pageflow/version.rb +1 -1
- data/lib/pageflow/widget_type.rb +13 -0
- data/lib/pageflow/zencoder_video_output_definition.rb +16 -16
- data/lib/tasks/pageflow_tasks.rake +14 -0
- data/spec/factories/entries.rb +4 -0
- data/spec/factories/revisions.rb +10 -0
- data/spec/factories/users.rb +6 -0
- data/spec/factories/video_files.rb +4 -0
- data/vendor/assets/javascripts/audio5.min.js +3 -0
- metadata +78 -15
- data/app/assets/javascripts/pageflow/editor/models/mixins/widget_subject.js +0 -37
- data/app/assets/javascripts/pageflow/editor/utils/reload_stylesheet.js +0 -9
- data/app/assets/stylesheets/pageflow/text_variants.scss +0 -24
- data/app/views/admin/accounts/_widgets_inline_help.html.erb +0 -5
- data/app/views/admin/memberships/_entity_account_input.html.erb +0 -5
- data/app/views/admin/memberships/_entity_entry_input.html.erb +0 -5
- data/app/views/admin/users/_quota_exhausted.html.erb +0 -1
- data/app/views/components/pageflow/admin/add_membership_button_if_needed.rb +0 -62
@@ -0,0 +1,23 @@
|
|
1
|
+
pageflow.WidgetType = pageflow.Object.extend({
|
2
|
+
initialize: function(serverSideConfig, clientSideConfig) {
|
3
|
+
this.name = serverSideConfig.name;
|
4
|
+
this.translationKey = serverSideConfig.translationKey;
|
5
|
+
this.configurationEditorView = clientSideConfig.configurationEditorView;
|
6
|
+
this.isOptional = clientSideConfig.isOptional;
|
7
|
+
},
|
8
|
+
|
9
|
+
hasConfiguration: function() {
|
10
|
+
return !!this.configurationEditorView;
|
11
|
+
},
|
12
|
+
|
13
|
+
createConfigurationEditorView: function(options) {
|
14
|
+
var constructor = this.configurationEditorView;
|
15
|
+
|
16
|
+
return new constructor(_.extend({
|
17
|
+
attributeTranslationKeyPrefixes: [
|
18
|
+
'pageflow.editor.widgets.attributes.' + this.name,
|
19
|
+
'pageflow.editor.widgets.common_attributes'
|
20
|
+
]
|
21
|
+
}, options));
|
22
|
+
}
|
23
|
+
});
|
@@ -0,0 +1,53 @@
|
|
1
|
+
pageflow.WidgetTypes = pageflow.Object.extend({
|
2
|
+
initialize: function() {
|
3
|
+
this._clientSideConfigs = {};
|
4
|
+
this._optionalRoles = {};
|
5
|
+
},
|
6
|
+
|
7
|
+
register: function(name, config) {
|
8
|
+
if (this._setup) {
|
9
|
+
throw 'Widget types already set up. Register widget types before initializers run.';
|
10
|
+
}
|
11
|
+
|
12
|
+
this._clientSideConfigs[name] = config;
|
13
|
+
},
|
14
|
+
|
15
|
+
setup: function(serverSideConfigsByRole) {
|
16
|
+
this._setup = true;
|
17
|
+
this._widgetTypesByName = {};
|
18
|
+
|
19
|
+
var roles = _.keys(serverSideConfigsByRole);
|
20
|
+
|
21
|
+
this._widgetTypesByRole = roles.reduce(_.bind(function(result, role) {
|
22
|
+
result[role] = serverSideConfigsByRole[role].map(_.bind(function(serverSideConfig) {
|
23
|
+
var clientSideConfig = this._clientSideConfigs[serverSideConfig.name] || {};
|
24
|
+
var widgetType = new pageflow.WidgetType(serverSideConfig, clientSideConfig);
|
25
|
+
|
26
|
+
this._widgetTypesByName[serverSideConfig.name] = widgetType;
|
27
|
+
return widgetType;
|
28
|
+
}, this));
|
29
|
+
|
30
|
+
return result;
|
31
|
+
}, this), {});
|
32
|
+
},
|
33
|
+
|
34
|
+
findAllByRole: function(role) {
|
35
|
+
return this._widgetTypesByRole[role] || [];
|
36
|
+
},
|
37
|
+
|
38
|
+
findByName: function(name) {
|
39
|
+
if (!this._widgetTypesByName[name]) {
|
40
|
+
throw('Could not find widget type with name "' + name +'"');
|
41
|
+
}
|
42
|
+
|
43
|
+
return this._widgetTypesByName[name];
|
44
|
+
},
|
45
|
+
|
46
|
+
registerRole: function(role, options) {
|
47
|
+
this._optionalRoles[role] = options.isOptional;
|
48
|
+
},
|
49
|
+
|
50
|
+
isOptional: function(role) {
|
51
|
+
return !!this._optionalRoles[role];
|
52
|
+
}
|
53
|
+
});
|
@@ -28,15 +28,23 @@ pageflow.EditorApi = pageflow.Object.extend(
|
|
28
28
|
this.failures = new pageflow.FailuresAPI();
|
29
29
|
|
30
30
|
/**
|
31
|
-
*
|
31
|
+
* Set up editor integration for page types.
|
32
32
|
* @alias pageTypes
|
33
33
|
* @memberof module:pageflow/editor.pageflow.editor
|
34
34
|
*/
|
35
35
|
this.pageTypes = new pageflow.PageTypes();
|
36
36
|
|
37
|
+
/**
|
38
|
+
* Setup editor integration for widget types.
|
39
|
+
* @alias widgetType
|
40
|
+
* @memberof module:pageflow/editor.pageflow.editor
|
41
|
+
*/
|
42
|
+
this.widgetTypes = new pageflow.WidgetTypes();
|
43
|
+
|
37
44
|
/**
|
38
45
|
* @alias fileTypes
|
39
46
|
* @memberof module:pageflow/editor.pageflow.editor
|
47
|
+
* Set up editor integration for file types
|
40
48
|
*/
|
41
49
|
this.fileTypes = new pageflow.FileTypes();
|
42
50
|
},
|
@@ -52,7 +52,6 @@
|
|
52
52
|
//= require ./initializers/setup_file_uploader
|
53
53
|
//= require ./initializers/setup_page_types
|
54
54
|
//= require ./initializers/setup_hotkeys
|
55
|
-
//= require ./initializers/setup_file_uploader
|
56
55
|
//= require ./initializers/edit_lock
|
57
56
|
//= require ./initializers/files_polling
|
58
57
|
//= require ./initializers/stylesheet_reloading
|
@@ -1,6 +1,8 @@
|
|
1
1
|
pageflow.SubsetCollection = Backbone.Collection.extend({
|
2
2
|
constructor: function(options) {
|
3
3
|
var adding = false;
|
4
|
+
var sorting = false;
|
5
|
+
var parentSorting = false;
|
4
6
|
|
5
7
|
options = options || {};
|
6
8
|
|
@@ -41,8 +43,26 @@ pageflow.SubsetCollection = Backbone.Collection.extend({
|
|
41
43
|
});
|
42
44
|
}
|
43
45
|
|
46
|
+
if (options.sortOnParentSort) {
|
47
|
+
this.listenTo(this.parent, 'sort', function() {
|
48
|
+
parentSorting = true;
|
49
|
+
|
50
|
+
if (!sorting) {
|
51
|
+
this.sort();
|
52
|
+
}
|
53
|
+
|
54
|
+
parentSorting = false;
|
55
|
+
});
|
56
|
+
}
|
57
|
+
|
44
58
|
this.listenTo(this, 'sort', function() {
|
45
|
-
|
59
|
+
sorting = true;
|
60
|
+
|
61
|
+
if (!parentSorting) {
|
62
|
+
this.parent.sort();
|
63
|
+
}
|
64
|
+
|
65
|
+
sorting = false;
|
46
66
|
});
|
47
67
|
|
48
68
|
Backbone.Collection.prototype.constructor
|
@@ -0,0 +1,13 @@
|
|
1
|
+
pageflow.ThemesCollection = Backbone.Collection.extend({
|
2
|
+
model: pageflow.Theme,
|
3
|
+
|
4
|
+
findByName: function(name) {
|
5
|
+
var theme = this.findWhere({name: name});
|
6
|
+
|
7
|
+
if (!theme) {
|
8
|
+
throw new Error('Found no theme by name ' + name);
|
9
|
+
}
|
10
|
+
|
11
|
+
return theme;
|
12
|
+
}
|
13
|
+
});
|
@@ -1,16 +1,31 @@
|
|
1
1
|
pageflow.WidgetsCollection = Backbone.Collection.extend({
|
2
2
|
model: pageflow.Widget,
|
3
3
|
|
4
|
-
initialize: function(
|
5
|
-
|
6
|
-
|
4
|
+
initialize: function() {
|
5
|
+
this.listenTo(this, 'change:type_name change:configuration', function() {
|
6
|
+
this.batchSave();
|
7
|
+
});
|
7
8
|
},
|
8
9
|
|
9
10
|
url: function() {
|
10
|
-
return this.subject.
|
11
|
+
return '/editor/subjects/entries/' + this.subject.id + '/widgets';
|
11
12
|
},
|
12
|
-
});
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
batchSave: function(options) {
|
15
|
+
var subject = this.subject;
|
16
|
+
|
17
|
+
return Backbone.sync('patch', subject, _.extend(options || {}, {
|
18
|
+
url: this.url() + '/batch',
|
19
|
+
|
20
|
+
attrs: {
|
21
|
+
widgets: this.map(function(widget) {
|
22
|
+
return widget.toJSON();
|
23
|
+
})
|
24
|
+
},
|
25
|
+
|
26
|
+
success: function(response) {
|
27
|
+
subject.trigger('sync:widgets', subject, response, {});
|
28
|
+
}
|
29
|
+
}));
|
30
|
+
}
|
31
|
+
});
|
@@ -78,5 +78,11 @@ pageflow.SidebarController = Backbone.Marionette.Controller.extend({
|
|
78
78
|
model: page.pageLinks().get(linkId),
|
79
79
|
page: page
|
80
80
|
}));
|
81
|
-
}
|
81
|
+
},
|
82
|
+
|
83
|
+
widget: function(id) {
|
84
|
+
this.region.show(new pageflow.EditWidgetView({
|
85
|
+
model: this.entry.widgets.get(id)
|
86
|
+
}));
|
87
|
+
},
|
82
88
|
});
|
@@ -6,18 +6,25 @@ pageflow.app.addInitializer(function(options) {
|
|
6
6
|
pageflow.audioFiles = pageflow.files.audio_files;
|
7
7
|
pageflow.textTrackFiles = pageflow.files.text_track_files;
|
8
8
|
|
9
|
+
var widgets = new pageflow.WidgetsCollection(options.widgets, {
|
10
|
+
widgetTypes: pageflow.editor.widgetTypes
|
11
|
+
});
|
12
|
+
|
13
|
+
pageflow.themes = new pageflow.ThemesCollection(options.themes);
|
9
14
|
pageflow.pages = new pageflow.PagesCollection(options.pages);
|
10
15
|
pageflow.chapters = new pageflow.ChaptersCollection(options.chapters);
|
11
16
|
pageflow.storylines = new pageflow.StorylinesCollection(options.storylines);
|
12
|
-
pageflow.entry = new pageflow.Entry(options.entry);
|
17
|
+
pageflow.entry = new pageflow.Entry(options.entry, {widgets: widgets});
|
13
18
|
pageflow.theming = new pageflow.Theming(options.theming);
|
14
19
|
pageflow.account = new Backbone.Model(options.account);
|
15
20
|
|
21
|
+
widgets.subject = pageflow.entry;
|
22
|
+
|
16
23
|
pageflow.entryData = new pageflow.PreviewEntryData({
|
24
|
+
entry: pageflow.entry,
|
17
25
|
storylines: pageflow.storylines,
|
18
26
|
chapters: pageflow.chapters,
|
19
|
-
pages: pageflow.pages
|
20
|
-
theming: pageflow.theming
|
27
|
+
pages: pageflow.pages
|
21
28
|
});
|
22
29
|
|
23
30
|
pageflow.storylineOrdering = new pageflow.StorylineOrdering(pageflow.storylines, pageflow.pages);
|
@@ -1,11 +1,16 @@
|
|
1
1
|
pageflow.app.addInitializer(function(options) {
|
2
2
|
pageflow.entry.on('change:pending_files_count', function(model, value) {
|
3
3
|
if (value < pageflow.entry.previous('pending_files_count')) {
|
4
|
-
pageflow.
|
4
|
+
pageflow.stylesheet.reload('entry');
|
5
5
|
}
|
6
6
|
});
|
7
7
|
|
8
8
|
pageflow.entry.on('use:files', function() {
|
9
|
-
pageflow.
|
9
|
+
pageflow.stylesheet.reload('entry');
|
10
10
|
});
|
11
|
-
|
11
|
+
|
12
|
+
pageflow.entry.configuration.on('change:theme_name', function() {
|
13
|
+
var theme = pageflow.entry.getTheme();
|
14
|
+
pageflow.stylesheet.update('theme', theme.get('stylesheet_path'));
|
15
|
+
});
|
16
|
+
});
|
@@ -29,7 +29,7 @@ pageflow.EditLockContainer = Backbone.Model.extend({
|
|
29
29
|
if (!this.pollingInteval) {
|
30
30
|
this.pollingInteval = setInterval(_.bind(function() {
|
31
31
|
this.acquire({polling: true});
|
32
|
-
}, this),
|
32
|
+
}, this), pageflow.config.editLockPollingIntervalInSeconds * 1000);
|
33
33
|
}
|
34
34
|
},
|
35
35
|
|
@@ -5,12 +5,9 @@ pageflow.Entry = Backbone.Model.extend({
|
|
5
5
|
i18nKey: 'pageflow/entry',
|
6
6
|
collectionName: 'entries',
|
7
7
|
|
8
|
-
autoSaveWidgets: true,
|
9
|
-
|
10
8
|
mixins: [pageflow.filesCountWatcher,
|
11
9
|
pageflow.polling,
|
12
|
-
pageflow.failureTracking,
|
13
|
-
pageflow.widgetSubject],
|
10
|
+
pageflow.failureTracking],
|
14
11
|
|
15
12
|
initialize: function(attributes, options) {
|
16
13
|
options = options || {};
|
@@ -18,6 +15,7 @@ pageflow.Entry = Backbone.Model.extend({
|
|
18
15
|
this.configuration = new pageflow.EntryConfiguration(this.get('configuration') || {});
|
19
16
|
this.configuration.parent = this;
|
20
17
|
|
18
|
+
this.themes = options.themes || pageflow.themes;
|
21
19
|
this.files = options.files || pageflow.files;
|
22
20
|
this.fileTypes = options.fileTypes || pageflow.editor.fileTypes;
|
23
21
|
this.storylines = options.storylines || pageflow.storylines;
|
@@ -25,6 +23,7 @@ pageflow.Entry = Backbone.Model.extend({
|
|
25
23
|
this.chapters = options.chapters || pageflow.chapters;
|
26
24
|
this.chapters.parentModel = this;
|
27
25
|
this.pages = pageflow.pages;
|
26
|
+
this.widgets = options.widgets;
|
28
27
|
|
29
28
|
this.imageFiles = pageflow.imageFiles;
|
30
29
|
this.videoFiles = pageflow.videoFiles;
|
@@ -56,6 +55,10 @@ pageflow.Entry = Backbone.Model.extend({
|
|
56
55
|
});
|
57
56
|
},
|
58
57
|
|
58
|
+
getTheme: function() {
|
59
|
+
return this.themes.findByName(this.configuration.get('theme_name'));
|
60
|
+
},
|
61
|
+
|
59
62
|
addStoryline: function(attributes) {
|
60
63
|
var storyline = this.buildStoryline(attributes);
|
61
64
|
storyline.save();
|
@@ -12,6 +12,7 @@ pageflow.FileStage = Backbone.Model.extend({
|
|
12
12
|
this.update();
|
13
13
|
this.listenTo(this.file, 'change:state', this.update);
|
14
14
|
this.listenTo(this.file, 'change:' + this.get('name') + '_progress', this.update);
|
15
|
+
this.listenTo(this.file, 'change:' + this.get('name') + '_error_message', this.update);
|
15
16
|
},
|
16
17
|
|
17
18
|
update: function() {
|
@@ -48,7 +48,9 @@ pageflow.Page = Backbone.Model.extend({
|
|
48
48
|
},
|
49
49
|
|
50
50
|
title: function() {
|
51
|
-
return this.configuration.get('title') ||
|
51
|
+
return this.configuration.get('title') ||
|
52
|
+
this.configuration.get('additional_title') ||
|
53
|
+
'';
|
52
54
|
},
|
53
55
|
|
54
56
|
thumbnailFile: function() {
|
@@ -1,13 +1,13 @@
|
|
1
1
|
pageflow.PreviewEntryData = pageflow.EntryData.extend({
|
2
2
|
initialize: function(options) {
|
3
|
+
this.entry = options.entry;
|
3
4
|
this.storylines = options.storylines;
|
4
5
|
this.chapters = options.chapters;
|
5
6
|
this.pages = options.pages;
|
6
|
-
this.theming = options.theming;
|
7
7
|
},
|
8
8
|
|
9
9
|
getThemingOption: function(name) {
|
10
|
-
return this.
|
10
|
+
return this.entry.getTheme().get(name);
|
11
11
|
},
|
12
12
|
|
13
13
|
getStorylineConfiguration: function(id) {
|
@@ -0,0 +1,25 @@
|
|
1
|
+
pageflow.Theme = Backbone.Model.extend({
|
2
|
+
title: function() {
|
3
|
+
return I18n.t('pageflow.' + this.get('name') + '_theme.name');
|
4
|
+
},
|
5
|
+
|
6
|
+
thumbnailUrl: function() {
|
7
|
+
return this.get('preview_thumbnail_url');
|
8
|
+
},
|
9
|
+
|
10
|
+
hasHomeButton: function() {
|
11
|
+
return this.get('home_button');
|
12
|
+
},
|
13
|
+
|
14
|
+
hasOverviewButton: function() {
|
15
|
+
return this.get('overview_button');
|
16
|
+
},
|
17
|
+
|
18
|
+
supportsEmphasizedPages: function() {
|
19
|
+
return this.get('emphasized_pages');
|
20
|
+
},
|
21
|
+
|
22
|
+
supportsScrollIndicatorModes: function() {
|
23
|
+
return this.get('scroll_indicator_modes');
|
24
|
+
}
|
25
|
+
});
|
@@ -1,23 +1,5 @@
|
|
1
1
|
pageflow.Theming = Backbone.Model.extend({
|
2
2
|
modelName: 'theming',
|
3
3
|
i18nKey: 'pageflow/theming',
|
4
|
-
collectionName: 'themings'
|
5
|
-
|
6
|
-
mixins: [pageflow.widgetSubject],
|
7
|
-
|
8
|
-
hasHomeButton: function() {
|
9
|
-
return this.get('home_button');
|
10
|
-
},
|
11
|
-
|
12
|
-
hasOverviewButton: function() {
|
13
|
-
return this.get('overview_button');
|
14
|
-
},
|
15
|
-
|
16
|
-
supportsEmphasizedPages: function() {
|
17
|
-
return this.get('emphasized_pages');
|
18
|
-
},
|
19
|
-
|
20
|
-
supportsScrollIndicatorModes: function() {
|
21
|
-
return this.get('scroll_indicator_modes');
|
22
|
-
}
|
4
|
+
collectionName: 'themings'
|
23
5
|
});
|
@@ -2,6 +2,26 @@ pageflow.Widget = Backbone.Model.extend({
|
|
2
2
|
paramRoot: 'widget',
|
3
3
|
i18nKey: 'pageflow/widget',
|
4
4
|
|
5
|
+
initialize: function(attributes, options) {
|
6
|
+
this.widgetTypes = options.widgetTypes;
|
7
|
+
|
8
|
+
this.configuration = new pageflow.WidgetConfiguration(
|
9
|
+
this.get('configuration') || {}
|
10
|
+
);
|
11
|
+
|
12
|
+
this.listenTo(this.configuration, 'change', function() {
|
13
|
+
this.trigger('change:configuration', this);
|
14
|
+
});
|
15
|
+
},
|
16
|
+
|
17
|
+
widgetType: function() {
|
18
|
+
return this.get('type_name') && this.widgetTypes.findByName(this.get('type_name'));
|
19
|
+
},
|
20
|
+
|
21
|
+
hasConfiguration: function() {
|
22
|
+
return !!(this.widgetType() && this.widgetType().hasConfiguration());
|
23
|
+
},
|
24
|
+
|
5
25
|
role: function() {
|
6
26
|
return this.id;
|
7
27
|
},
|
@@ -13,7 +33,8 @@ pageflow.Widget = Backbone.Model.extend({
|
|
13
33
|
toJSON: function() {
|
14
34
|
return {
|
15
35
|
role: this.role(),
|
16
|
-
type_name: this.get('type_name')
|
36
|
+
type_name: this.get('type_name'),
|
37
|
+
configuration: this.configuration.toJSON()
|
17
38
|
};
|
18
39
|
},
|
19
40
|
});
|
@@ -5,6 +5,7 @@ pageflow.SidebarRouter = Backbone.Marionette.AppRouter.extend({
|
|
5
5
|
'pages/:id/:tab': 'page',
|
6
6
|
'chapters/:id': 'chapter',
|
7
7
|
'storylines/:id': 'storyline',
|
8
|
+
'widgets/:id': 'widget',
|
8
9
|
|
9
10
|
'files/:collectionName?handler=:handler&payload=:payload&filter=:filter': 'files',
|
10
11
|
'files/:collectionName?handler=:handler&payload=:payload': 'files',
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<div class="box">
|
2
|
+
<div class="content">
|
3
|
+
<div>
|
4
|
+
<h2 class="themes_header"><%= I18n.t('pageflow.editor.templates.change_theme_dialog.header') %></h2>
|
5
|
+
<div class="themes_panel">
|
6
|
+
</div>
|
7
|
+
<div class="preview_panel">
|
8
|
+
<h2 class="preview_header"><%= I18n.t('pageflow.editor.templates.change_theme_dialog.preview_header_prefix') %>
|
9
|
+
<span class="preview_header_theme_name"></span><%= I18n.t('pageflow.editor.templates.change_theme_dialog.preview_header_suffix') %>
|
10
|
+
</h2>
|
11
|
+
<div class="preview_image_region">
|
12
|
+
<img class="preview_image" src="default_template.png">
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div class="footer">
|
19
|
+
<a href="" class="close">
|
20
|
+
<%= I18n.t('pageflow.editor.templates.change_theme_dialog.close') %>
|
21
|
+
</a>
|
22
|
+
</div>
|
23
|
+
</div>
|
@@ -1,2 +1 @@
|
|
1
|
-
<
|
2
|
-
</div>
|
1
|
+
<a class="back"><%= I18n.t('pageflow.editor.templates.edit_widget.back') %></a>
|
@@ -3,5 +3,5 @@
|
|
3
3
|
<span class="inline_help"></span>
|
4
4
|
</label>
|
5
5
|
<div class="title"></div>
|
6
|
-
<button class="unset"
|
7
|
-
<button class="choose"
|
6
|
+
<button class="unset"></button>
|
7
|
+
<button class="choose"></button>
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
pageflow.stylesheet = {
|
2
|
+
reload: function(name) {
|
3
|
+
var link = this.selectLink(name);
|
4
|
+
|
5
|
+
if (!link.data('originalHref')) {
|
6
|
+
link.data('originalHref', link.attr('href'));
|
7
|
+
}
|
8
|
+
|
9
|
+
link.attr('href', link.data('originalHref') + '&reload=' + new Date().getTime());
|
10
|
+
},
|
11
|
+
|
12
|
+
update: function(name, stylesheetPath) {
|
13
|
+
var link = this.selectLink(name);
|
14
|
+
|
15
|
+
if (link.attr('href') !== stylesheetPath) {
|
16
|
+
link.attr('href', stylesheetPath);
|
17
|
+
}
|
18
|
+
},
|
19
|
+
|
20
|
+
selectLink: function(name) {
|
21
|
+
return $('head link[data-name=' + name + ']');
|
22
|
+
}
|
23
|
+
};
|
@@ -0,0 +1,76 @@
|
|
1
|
+
pageflow.ChangeThemeDialogView = Backbone.Marionette.ItemView.extend({
|
2
|
+
template: 'templates/change_theme_dialog',
|
3
|
+
className: 'change_theme dialog editor',
|
4
|
+
|
5
|
+
mixins: [pageflow.dialogView],
|
6
|
+
|
7
|
+
ui: {
|
8
|
+
content: '.content',
|
9
|
+
themesPanel: '.themes_panel',
|
10
|
+
previewPanel: '.preview_panel',
|
11
|
+
previewImageRegion: '.preview_image_region',
|
12
|
+
previewImage: '.preview_image',
|
13
|
+
previewHeaderThemeName: '.preview_header_theme_name'
|
14
|
+
},
|
15
|
+
|
16
|
+
initialize: function(options) {
|
17
|
+
this.selection = new Backbone.Model();
|
18
|
+
var themeInUse = this.options.themes.findByName(this.options.themeInUse);
|
19
|
+
this.selection.set('theme', themeInUse);
|
20
|
+
this.listenTo(this.selection, 'change:theme', function() {
|
21
|
+
if (!this.selection.get('theme')) {
|
22
|
+
this.selection.set('theme', themeInUse);
|
23
|
+
}
|
24
|
+
this.update();
|
25
|
+
});
|
26
|
+
},
|
27
|
+
|
28
|
+
onRender: function() {
|
29
|
+
var themes = this.options.themes;
|
30
|
+
this.themesView = new pageflow.CollectionView({
|
31
|
+
collection: themes,
|
32
|
+
tagName: 'ul',
|
33
|
+
itemViewConstructor: pageflow.ThemeItemView,
|
34
|
+
itemViewOptions: {
|
35
|
+
selection: this.selection,
|
36
|
+
onUse: this.options.onUse,
|
37
|
+
themes: themes,
|
38
|
+
themeInUse: this.options.themeInUse
|
39
|
+
}
|
40
|
+
});
|
41
|
+
|
42
|
+
this.ui.themesPanel.append(this.subview(this.themesView).el);
|
43
|
+
|
44
|
+
this.ui.previewPanel.append(this.subview(new pageflow.LoadingView({tagName: 'div'})).el);
|
45
|
+
|
46
|
+
this.update();
|
47
|
+
},
|
48
|
+
|
49
|
+
update: function() {
|
50
|
+
var that = this;
|
51
|
+
var selectedTheme = this.options.themes.findByName(that.selection.get('theme').get('name'));
|
52
|
+
this.ui.previewImage.hide();
|
53
|
+
this.ui.previewImage.one('load', function() {
|
54
|
+
$(this).show();
|
55
|
+
});
|
56
|
+
this.ui.previewImage.attr('src', selectedTheme.get('preview_image_url'));
|
57
|
+
this.ui.previewHeaderThemeName.text(selectedTheme.title());
|
58
|
+
}
|
59
|
+
});
|
60
|
+
|
61
|
+
pageflow.ChangeThemeDialogView.changeTheme = function(options) {
|
62
|
+
return $.Deferred(function(deferred) {
|
63
|
+
options.onUse = function(theme) {
|
64
|
+
deferred.resolve(theme);
|
65
|
+
view.close();
|
66
|
+
};
|
67
|
+
|
68
|
+
var view = new pageflow.ChangeThemeDialogView(options);
|
69
|
+
|
70
|
+
view.on('close', function() {
|
71
|
+
deferred.reject();
|
72
|
+
});
|
73
|
+
|
74
|
+
pageflow.app.dialogRegion.show(view.render());
|
75
|
+
}).promise();
|
76
|
+
};
|
@@ -1,7 +1,9 @@
|
|
1
1
|
pageflow.ConfigurationEditorTabView.groups.define('options', function(options) {
|
2
|
+
var theme = pageflow.entry.getTheme();
|
3
|
+
|
2
4
|
this.input('display_in_navigation', pageflow.CheckBoxInputView);
|
3
5
|
|
4
|
-
if (
|
6
|
+
if (theme.supportsEmphasizedPages()) {
|
5
7
|
this.input('emphasize_in_navigation', pageflow.CheckBoxInputView);
|
6
8
|
}
|
7
9
|
|
@@ -23,7 +25,7 @@ pageflow.ConfigurationEditorTabView.groups.define('options', function(options) {
|
|
23
25
|
});
|
24
26
|
}
|
25
27
|
|
26
|
-
if (
|
28
|
+
if (theme.supportsScrollIndicatorModes()) {
|
27
29
|
this.input('scroll_indicator_mode', pageflow.SelectInputView, {
|
28
30
|
values: pageflow.Page.scrollIndicatorModes
|
29
31
|
});
|