pageflow-internal-links 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +22 -0
  3. data/.jshintrc +22 -0
  4. data/CHANGELOG.md +7 -0
  5. data/Gemfile +10 -0
  6. data/README.md +63 -0
  7. data/Rakefile +7 -0
  8. data/app/assets/images/pageflow/internal_links_grid_pictogram.png +0 -0
  9. data/app/assets/images/pageflow/internal_links_grid_pictogram_small.png +0 -0
  10. data/app/assets/images/pageflow/internal_links_grid_sprite.png +0 -0
  11. data/app/assets/images/pageflow/internal_links_list_pictogram.png +0 -0
  12. data/app/assets/images/pageflow/internal_links_list_pictogram_small.png +0 -0
  13. data/app/assets/images/pageflow/internal_links_list_sprite.png +0 -0
  14. data/app/assets/images/pageflow/ov-internal_links_grid.png +0 -0
  15. data/app/assets/javascripts/pageflow/internal_links/editor/collections/grid_page_links_collection.js +20 -0
  16. data/app/assets/javascripts/pageflow/internal_links/editor/collections/list_page_links_collection.js +12 -0
  17. data/app/assets/javascripts/pageflow/internal_links/editor/collections/page_links_collection.js +90 -0
  18. data/app/assets/javascripts/pageflow/internal_links/editor/config.js +45 -0
  19. data/app/assets/javascripts/pageflow/internal_links/editor/controllers/side_bar_controller.js +14 -0
  20. data/app/assets/javascripts/pageflow/internal_links/editor/models/page_configuration_mixin.js +19 -0
  21. data/app/assets/javascripts/pageflow/internal_links/editor/models/page_link.js +35 -0
  22. data/app/assets/javascripts/pageflow/internal_links/editor/routers/side_bar_router.js +5 -0
  23. data/app/assets/javascripts/pageflow/internal_links/editor/templates/edit_page_link.jst.ejs +3 -0
  24. data/app/assets/javascripts/pageflow/internal_links/editor/templates/grid_item_embedded.jst.ejs +4 -0
  25. data/app/assets/javascripts/pageflow/internal_links/editor/templates/list_item_embedded.jst.ejs +7 -0
  26. data/app/assets/javascripts/pageflow/internal_links/editor/views/edit_page_link_view.js +67 -0
  27. data/app/assets/javascripts/pageflow/internal_links/editor/views/editable_links_mode_view.js +10 -0
  28. data/app/assets/javascripts/pageflow/internal_links/editor/views/grid_configuration_editor_view.js +30 -0
  29. data/app/assets/javascripts/pageflow/internal_links/editor/views/grid_item_embedded_view.js +227 -0
  30. data/app/assets/javascripts/pageflow/internal_links/editor/views/list_configuration_editor_view.js +29 -0
  31. data/app/assets/javascripts/pageflow/internal_links/editor/views/list_embedded_view.js +23 -0
  32. data/app/assets/javascripts/pageflow/internal_links/editor/views/list_item_embedded_view.js +103 -0
  33. data/app/assets/javascripts/pageflow/internal_links/editor/views/page_link_embedded_view.js +106 -0
  34. data/app/assets/javascripts/pageflow/internal_links/editor.js +11 -0
  35. data/app/assets/javascripts/pageflow/internal_links/grid_page_type.js +31 -0
  36. data/app/assets/javascripts/pageflow/internal_links/list_page_type.js +29 -0
  37. data/app/assets/javascripts/pageflow/internal_links.js +2 -0
  38. data/app/assets/stylesheets/pageflow/internal_links/editor/embedded_grid_item.css.scss +118 -0
  39. data/app/assets/stylesheets/pageflow/internal_links/editor/embedded_list_item.scss +33 -0
  40. data/app/assets/stylesheets/pageflow/internal_links/editor.css.scss +2 -0
  41. data/app/assets/stylesheets/pageflow/internal_links/grid.scss +230 -0
  42. data/app/assets/stylesheets/pageflow/internal_links/list.scss +76 -0
  43. data/app/assets/stylesheets/pageflow/internal_links.css.scss +2 -0
  44. data/app/helpers/pageflow/internal_links/grid_helper.rb +50 -0
  45. data/app/helpers/pageflow/internal_links/list_helper.rb +10 -0
  46. data/app/helpers/pageflow/internal_links/page_links.rb +79 -0
  47. data/app/views/pageflow/internal_links/grid/_grid.html.erb +7 -0
  48. data/app/views/pageflow/internal_links/grid/page.html.erb +25 -0
  49. data/app/views/pageflow/internal_links/list/_list.html.erb +6 -0
  50. data/app/views/pageflow/internal_links/list/_page_link.html.erb +14 -0
  51. data/app/views/pageflow/internal_links/list/page.html.erb +26 -0
  52. data/config/locales/de.yml +61 -0
  53. data/config/locales/en.yml +64 -0
  54. data/db/migrate/20150109121800_rename_internal_links_page_type.rb +13 -0
  55. data/lib/pageflow/internal_links/engine.rb +9 -0
  56. data/lib/pageflow/internal_links/grid_page_type.rb +19 -0
  57. data/lib/pageflow/internal_links/list_page_type.rb +19 -0
  58. data/lib/pageflow/internal_links/plugin.rb +9 -0
  59. data/lib/pageflow-internal-links.rb +17 -0
  60. data/pageflow-internal-links.gemspec +18 -0
  61. metadata +117 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NTYxZDcyYmRmMGViYjdlZGMxMzFkNTJmOGI1MmI1ZjQ1ODM3M2QxNQ==
5
+ data.tar.gz: !binary |-
6
+ Y2NkMzU4OTliNzRiNWU2MmE3MTg0ZTcxOWRmZTk1ZDQyYzgwOGQ3Zg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZDQ2NWFmOGUyMGMzMWUyNGYzYTNmODE4YzgwYjk4NDYwYmNhN2Y2YTdhYjg4
10
+ Mjg1ZmVlNzFiNTQxMzYyODZjMzIyOWU5MWM4MTIwZmRjNGU4YjBhYzgzMDNj
11
+ MTg0ZGQ4ZjZkNDJhNjZlYjFkN2UwYzg1YzM5ZTM4ZmQ4MzU4NDY=
12
+ data.tar.gz: !binary |-
13
+ OTQ0YTZlY2MyMTJiMDJiNDczMWIwYTNlYjU0NTVjZTI1MjBjMTdkNDgyMWE0
14
+ YWU4N2M3ZmJhNjJhYjQyNzNmYTBkMjJjMTVlOTJkMTBiZmJmZTg0ZWI1NGI3
15
+ ZWVhZmM1NGNlZTU0Y2JhYzdiMDE2YWIzZDAzYzRiZjg0MzQ1YjM=
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ *.sqlite3
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ .idea
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ log
20
+ Gemfile.lock
21
+
22
+ .localeapp
data/.jshintrc ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "browser": true,
3
+ "undef": true,
4
+ "immed": true,
5
+ "trailing": true,
6
+ "globals": {
7
+ "jQuery": true,
8
+ "$": true,
9
+ "Backbone": true,
10
+ "Cocktail": true,
11
+ "_": true,
12
+ "vjs": true,
13
+ "Audio5js": true,
14
+ "I18n": true,
15
+
16
+ "pageflow": true,
17
+ "editor": true,
18
+
19
+ "confirm": true,
20
+ "alert": true
21
+ }
22
+ }
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # CHANGELOG
2
+
3
+ ### Version 0.1.0
4
+
5
+ 2015-10-23
6
+
7
+ Initial release.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in chart.gemspec
4
+ gemspec
5
+
6
+ # Rails 4 compat
7
+ gem 'activeadmin', :git => 'https://github.com/codevise/active_admin.git', :branch => 'rails4'
8
+ gem 'ransack'
9
+ gem 'inherited_resources', '1.4.1'
10
+ gem 'formtastic', '2.3.0.rc2'
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Pageflow Internal Links
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/pageflow-internal-links.svg)](http://badge.fury.io/rb/pageflow-internal-links)
4
+
5
+ Page types for linking to pages inside a Pageflow.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ # Gemfile
12
+ gem 'pageflow-internal-links'
13
+
14
+ Register the page types:
15
+
16
+ # config/initializers/pageflow.rb
17
+ Pageflow.configure do |config|
18
+ config.page_types.register(Pageflow::InternalLinks.grid_page_type)
19
+ end
20
+
21
+ Include javascripts and stylesheets:
22
+
23
+ # app/assets/javascripts/pageflow/application.js
24
+ //= require pageflow/internal_links
25
+
26
+ # app/assets/javascripts/pageflow/editor.js
27
+ //= require pageflow/internal_links/editor
28
+
29
+ # app/assets/stylesheets/pageflow/application.css.scss
30
+ @import "pageflow/internal_links";
31
+
32
+ # app/assets/stylesheets/pageflow/editor.css.scss
33
+ @import "pageflow/internal_links/editor";
34
+
35
+ Install dependencies:
36
+
37
+ bundle install
38
+
39
+ Copy migrations of pageflow-internal-links into your project:
40
+
41
+ bundle exec rake pageflow_internal_links:install:migrations
42
+
43
+ Migrate the database:
44
+
45
+ bundle exec rake db:migrate
46
+
47
+ Restart the application server.
48
+
49
+ ## Troubleshooting
50
+
51
+ If you run into problems while installing the page type, please also
52
+ refer to the
53
+ [Troubleshooting](https://github.com/codevise/pageflow/wiki/Troubleshooting)
54
+ wiki page in the
55
+ [Pageflow repository](https://github.com/codevise/pageflow). If that
56
+ doesn't help, consider
57
+ [filing an issue](https://github.com/codevise/pageflow-internal-links/issues).
58
+
59
+ ## Contributing Locales
60
+
61
+ Edit the translations directly on the
62
+ [pageflow-internal-links](http://www.localeapp.com/projects/public?search=tf/pageflow-internal-links)
63
+ locale project.
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,20 @@
1
+ //= require ./page_links_collection
2
+
3
+ pageflow.internalLinks.GridPageLinksCollection = pageflow.internalLinks.PageLinksCollection.extend({
4
+ canAddLink: function() {
5
+ return this.defaultPosition() !== undefined;
6
+ },
7
+
8
+ defaultPosition: function() {
9
+ var collection = this;
10
+
11
+ return _.chain(25)
12
+ .times(function(index) {
13
+ return index;
14
+ })
15
+ .find(function(position) {
16
+ return !collection.findWhere({position: position});
17
+ })
18
+ .value();
19
+ }
20
+ });
@@ -0,0 +1,12 @@
1
+ //= require ./page_links_collection
2
+
3
+ pageflow.internalLinks.ListPageLinksCollection = pageflow.internalLinks.PageLinksCollection.extend({
4
+ defaultPosition: function() {
5
+ return Math.max(0, _.max(this.map(function(pageLink) {
6
+ return pageLink.get('position');
7
+ }))) + 1;
8
+ },
9
+
10
+ saveOrder: function() {
11
+ }
12
+ });
@@ -0,0 +1,90 @@
1
+ pageflow.internalLinks.PageLinksCollection = Backbone.Collection.extend({
2
+ model: pageflow.internalLinks.PageLink,
3
+
4
+ comparator: 'position',
5
+
6
+ initialize: function(models, options) {
7
+ this.configuration = options.configuration;
8
+ this.page = options.configuration.page;
9
+
10
+ this.load();
11
+
12
+ this.listenTo(this, 'add remove change', this.save);
13
+ this.listenTo(this.configuration, 'change:internal_links', this.load);
14
+ },
15
+
16
+ addLink: function(targetPageId) {
17
+ this.addWithPosition(this.defaultPosition(), targetPageId);
18
+ },
19
+
20
+ canAddLink: function(targetPageId) {
21
+ return true;
22
+ },
23
+
24
+ updateLink: function(link, targetPageId) {
25
+ link.set('target_page_id', targetPageId);
26
+ },
27
+
28
+ removeLink: function(link) {
29
+ this.remove(link);
30
+ },
31
+
32
+ addWithPosition: function(position, targetPageId) {
33
+ this.add(this.pageLinkAttributes(position, targetPageId));
34
+ },
35
+
36
+ removeByPosition: function(position) {
37
+ this.remove(this.findByPosition(position));
38
+ },
39
+
40
+ findByPosition: function(position) {
41
+ return this.findWhere({position: position});
42
+ },
43
+
44
+ load: function() {
45
+ this.set(this.pageLinksAttributes() ||
46
+ this.legacyPageLinksAttributes());
47
+ },
48
+
49
+ save: function(referenceKey, pageId) {
50
+ this.configuration.set('internal_links', this.map(function(pageLink) {
51
+ return pageLink.toSerializedJSON();
52
+ }));
53
+ },
54
+
55
+ pageLinksAttributes: function() {
56
+ if (this.configuration.has('internal_links')) {
57
+ return this.configuration.get('internal_links') || [];
58
+ }
59
+ },
60
+
61
+ legacyPageLinksAttributes: function() {
62
+ return _(this.configuration.get('linked_page_ids') || {}).reduce(function(result, pageId, position) {
63
+ var page = pageflow.pages.getByPermaId(pageId);
64
+
65
+ if (page) {
66
+ result.push(this.pageLinkAttributes(parseInt(position, 10) - 1,
67
+ pageId,
68
+ this.configuration.page.id + ':' + position));
69
+ }
70
+
71
+ return result;
72
+ }, [], this);
73
+ },
74
+
75
+ pageLinkAttributes: function(position, targetPageId, id) {
76
+ return {
77
+ id: id || this.getUniqueId(),
78
+ target_page_id: targetPageId,
79
+ position: position
80
+ };
81
+ },
82
+
83
+ getUniqueId: function() {
84
+ var maxId = Math.max(0, _.max(this.map(function(pageLink) {
85
+ return parseInt(pageLink.id.split(':').pop(), 10);
86
+ })));
87
+
88
+ return this.configuration.page.id + ':' + (maxId + 1);
89
+ }
90
+ });
@@ -0,0 +1,45 @@
1
+ pageflow.editor.pageTypes.register('internal_links_grid', {
2
+ configurationEditorView: pageflow.internalLinks.GridConfigurationEditorView,
3
+
4
+ embeddedViews: {
5
+ 'nav li': {
6
+ view: pageflow.internalLinks.GridItemEmbeddedView,
7
+ options: {propertyName: 'linked_page_ids'}
8
+ },
9
+
10
+ '.background_image': {
11
+ view: pageflow.BackgroundImageEmbeddedView,
12
+ options: {propertyName: 'background_image_id'}
13
+ }
14
+ },
15
+
16
+ pageLinks: function(configuration) {
17
+ return configuration.internalLinksGrid();
18
+ }
19
+ });
20
+
21
+ pageflow.editor.pageTypes.register('internal_links_list', {
22
+ configurationEditorView: pageflow.internalLinks.ListConfigurationEditorView,
23
+
24
+ embeddedViews: {
25
+ 'nav': {
26
+ view: pageflow.internalLinks.ListEmbeddedView
27
+ },
28
+
29
+ '.background_image': {
30
+ view: pageflow.BackgroundImageEmbeddedView,
31
+ options: {propertyName: 'background_image_id'}
32
+ }
33
+ },
34
+
35
+ pageLinks: function(configuration) {
36
+ return configuration.internalLinksList();
37
+ }
38
+ });
39
+
40
+ pageflow.editor.registerPageConfigurationMixin(pageflow.internalLinks.pageConfigurationMixin);
41
+
42
+ pageflow.editor.registerSideBarRouting({
43
+ router: pageflow.internalLinks.SideBarRouter,
44
+ controller: pageflow.internalLinks.SideBarController
45
+ });
@@ -0,0 +1,14 @@
1
+ pageflow.internalLinks.SideBarController = Backbone.Marionette.Controller.extend({
2
+ initialize: function(options) {
3
+ this.region = options.region;
4
+ },
5
+
6
+ pageLink: function(pageId, linkId) {
7
+ var page = pageflow.pages.get(pageId);
8
+
9
+ this.region.show(new pageflow.internalLinks.EditPageLinkView({
10
+ model: page.pageLinks().get(linkId),
11
+ page: page
12
+ }));
13
+ }
14
+ });
@@ -0,0 +1,19 @@
1
+ pageflow.internalLinks.pageConfigurationMixin = {
2
+ internalLinksList: function() {
3
+ this._internalLinksList = this._internalLinksList ||
4
+ new pageflow.internalLinks.ListPageLinksCollection(null, {
5
+ configuration: this
6
+ });
7
+
8
+ return this._internalLinksList;
9
+ },
10
+
11
+ internalLinksGrid: function() {
12
+ this._internalLinksGrid = this._internalLinksGrid ||
13
+ new pageflow.internalLinks.GridPageLinksCollection(null, {
14
+ configuration: this
15
+ });
16
+
17
+ return this._internalLinksGrid;
18
+ }
19
+ };
@@ -0,0 +1,35 @@
1
+ pageflow.internalLinks.PageLink = Backbone.Model.extend({
2
+ i18nKey: 'pageflow/internal_links/page_link',
3
+
4
+ targetPage: function() {
5
+ return pageflow.pages.getByPermaId(this.get('target_page_id'));
6
+ },
7
+
8
+ label: function() {
9
+ return this.get('label');
10
+ },
11
+
12
+ editPath: function() {
13
+ return '/internal_links_pages/' + this.getRoutableId() + '/page_links/' + this.id;
14
+ },
15
+
16
+ getRoutableId: function() {
17
+ return this.collection.page.id;
18
+ },
19
+
20
+ toSerializedJSON: function() {
21
+ return _.omit(this.attributes, 'highlighted');
22
+ },
23
+
24
+ highlight: function() {
25
+ this.set('highlighted', true);
26
+ },
27
+
28
+ resetHighlight: function() {
29
+ this.unset('highlighted');
30
+ },
31
+
32
+ remove: function() {
33
+ this.collection.remove(this);
34
+ }
35
+ });
@@ -0,0 +1,5 @@
1
+ pageflow.internalLinks.SideBarRouter = Backbone.Marionette.AppRouter.extend({
2
+ appRoutes: {
3
+ 'internal_links_pages/:pageId/page_links/:id': 'pageLink'
4
+ }
5
+ });
@@ -0,0 +1,3 @@
1
+ <a class="back"><%= I18n.t('pageflow.internal_links.editor.templates.edit_page_link.back') %></a>
2
+ <a class="destroy"><%= I18n.t('pageflow.internal_links.editor.templates.edit_page_link.destroy') %></a>
3
+ <div class="form_container"></div>
@@ -0,0 +1,4 @@
1
+ <a class="edit" href="" title="<%= I18n.t('pageflow.internal_links.editor.templates.embedded.grid_page_link.edit') %>"></a>
2
+ <a class="set" href="" title="<%= I18n.t('pageflow.internal_links.editor.templates.embedded.grid_page_link.set') %>"></a>
3
+ <div class="placeholder"></div>
4
+ <span class="title"></span>
@@ -0,0 +1,7 @@
1
+ <a class="edit" href="" title="<%= I18n.t('pageflow.internal_links.editor.templates.list_item_embedded.edit') %>"></a>
2
+
3
+ <a class="page_link" href="#">
4
+ <div class="details">
5
+ <p class="page_description"></p>
6
+ </div>
7
+ </a>
@@ -0,0 +1,67 @@
1
+ pageflow.internalLinks.EditPageLinkView = Backbone.Marionette.Layout.extend({
2
+ template: 'pageflow/internal_links/editor/templates/edit_page_link',
3
+
4
+ regions: {
5
+ formContainer: '.form_container'
6
+ },
7
+
8
+ ui: {
9
+ backButton: 'a.back'
10
+ },
11
+
12
+ events: {
13
+ 'click a.back': 'goBack',
14
+
15
+ 'click a.destroy': 'destroy'
16
+ },
17
+
18
+ onRender: function() {
19
+ var configurationEditor = new pageflow.ConfigurationEditorView({
20
+ model: this.model
21
+ });
22
+
23
+ this.configure(configurationEditor);
24
+ this.formContainer.show(configurationEditor);
25
+
26
+ this.highlight();
27
+ },
28
+
29
+ highlight: function() {
30
+ var page = this.model.collection.page;
31
+
32
+ this.model.highlight();
33
+ page.set('internal_links_editable', true);
34
+
35
+ this.listenTo(this, 'close', function() {
36
+ this.model.resetHighlight();
37
+ page.unset('internal_links_editable');
38
+ });
39
+ },
40
+
41
+ configure: function(configurationEditor) {
42
+ configurationEditor.tab('general', function() {
43
+ this.input('label', pageflow.TextInputView);
44
+ this.input('target_page_id', pageflow.PageLinkInputView);
45
+ this.input('page_transition', pageflow.SelectInputView, {
46
+ translationKeyPrefix: 'pageflow.page_transitions',
47
+ includeBlank: true,
48
+ blankTranslationKey: 'pageflow.internal_links.editor.views.edit_page_link_view.default_page_transition',
49
+ values: pageflow.pageTransitions.names()
50
+ });
51
+ this.input('description', pageflow.TextAreaInputView, {
52
+ size: 'short'
53
+ });
54
+ });
55
+ },
56
+
57
+ destroy: function() {
58
+ if (confirm(I18n.t('pageflow.internal_links.editor.views.edit_page_link_view.confirm_destroy'))) {
59
+ this.model.remove();
60
+ this.goBack();
61
+ }
62
+ },
63
+
64
+ goBack: function() {
65
+ pageflow.editor.navigate('/pages/' + this.options.page.id + '/links', {trigger: true});
66
+ }
67
+ });
@@ -0,0 +1,10 @@
1
+ pageflow.internalLinks.EditableLinksModeView = Backbone.Marionette.View.extend({
2
+ render: function() {
3
+ this.model.set('internal_links_editable', true);
4
+ return this;
5
+ },
6
+
7
+ onClose: function() {
8
+ this.model.unset('internal_links_editable');
9
+ }
10
+ });
@@ -0,0 +1,30 @@
1
+ pageflow.internalLinks.GridConfigurationEditorView = pageflow.ConfigurationEditorView.extend({
2
+ configure: function() {
3
+ this.tab('general', function() {
4
+ this.group('general');
5
+ });
6
+
7
+ this.tab('files', function() {
8
+ this.input('background_image_id', pageflow.FileInputView, {collection: pageflow.imageFiles});
9
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
10
+ collection: pageflow.imageFiles,
11
+ positioning: false
12
+ });
13
+ });
14
+
15
+ this.tab('links', function() {
16
+ this.view(pageflow.internalLinks.EditableLinksModeView, {
17
+ model: this.model.page
18
+ });
19
+
20
+ this.input('linked_pages_layout', pageflow.SelectInputView, {values: pageflow.Page.linkedPagesLayouts});
21
+ this.view(pageflow.PageLinksView, {
22
+ model: this.model.page
23
+ });
24
+ });
25
+
26
+ this.tab('options', function() {
27
+ this.group('options');
28
+ });
29
+ }
30
+ });