pageflow-external-links 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +19 -0
  3. data/.jshintignore +1 -0
  4. data/.jshintrc +22 -0
  5. data/Gemfile +10 -0
  6. data/README.md +49 -0
  7. data/Rakefile +7 -0
  8. data/app/assets/images/pageflow/external_links_pictogram.png +0 -0
  9. data/app/assets/images/pageflow/external_links_pictogram_small.png +0 -0
  10. data/app/assets/images/pageflow/ov-external_links.png +0 -0
  11. data/app/assets/javascript/pageflow/external_links.js +4 -0
  12. data/app/assets/javascript/pageflow/external_links/editor.js +12 -0
  13. data/app/assets/javascript/pageflow/external_links/editor/collections/site_references_collection.js +11 -0
  14. data/app/assets/javascript/pageflow/external_links/editor/collections/sites_collection.js +22 -0
  15. data/app/assets/javascript/pageflow/external_links/editor/config.js +17 -0
  16. data/app/assets/javascript/pageflow/external_links/editor/controllers/sidebar_controller.js +34 -0
  17. data/app/assets/javascript/pageflow/external_links/editor/models/configuration_mixin.js +38 -0
  18. data/app/assets/javascript/pageflow/external_links/editor/models/site.js +25 -0
  19. data/app/assets/javascript/pageflow/external_links/editor/models/site_file_selection_handler.js +13 -0
  20. data/app/assets/javascript/pageflow/external_links/editor/models/site_reference.js +7 -0
  21. data/app/assets/javascript/pageflow/external_links/editor/models/site_selection_handler.js +7 -0
  22. data/app/assets/javascript/pageflow/external_links/editor/routers/sidebar_router.js +8 -0
  23. data/app/assets/javascript/pageflow/external_links/editor/templates/edit_site.jst.ejs +10 -0
  24. data/app/assets/javascript/pageflow/external_links/editor/templates/embedded/list_item.jst.ejs +5 -0
  25. data/app/assets/javascript/pageflow/external_links/editor/templates/inputs/site_reference.jst.ejs +7 -0
  26. data/app/assets/javascript/pageflow/external_links/editor/templates/site_item.jst.ejs +6 -0
  27. data/app/assets/javascript/pageflow/external_links/editor/templates/site_reference_item.jst.ejs +6 -0
  28. data/app/assets/javascript/pageflow/external_links/editor/templates/sites.jst.ejs +1 -0
  29. data/app/assets/javascript/pageflow/external_links/editor/templates/sites_blank_slate.jst.ejs +1 -0
  30. data/app/assets/javascript/pageflow/external_links/editor/views/configuration_editor.js +23 -0
  31. data/app/assets/javascript/pageflow/external_links/editor/views/edit_site_view.js +69 -0
  32. data/app/assets/javascript/pageflow/external_links/editor/views/embedded/list_embedded_view.js +22 -0
  33. data/app/assets/javascript/pageflow/external_links/editor/views/embedded/list_item_embedded_view.js +56 -0
  34. data/app/assets/javascript/pageflow/external_links/editor/views/inputs/site_reference_input_view.js +31 -0
  35. data/app/assets/javascript/pageflow/external_links/editor/views/site_item_view.js +44 -0
  36. data/app/assets/javascript/pageflow/external_links/editor/views/site_reference_item_view.js +32 -0
  37. data/app/assets/javascript/pageflow/external_links/editor/views/sites_view.js +35 -0
  38. data/app/assets/javascript/pageflow/external_links/page_type.js +141 -0
  39. data/app/assets/stylesheets/pageflow/external_links.css.scss +175 -0
  40. data/app/assets/stylesheets/pageflow/external_links/editor.css.scss +97 -0
  41. data/app/controllers/pageflow/external_links/sites_controller.rb +40 -0
  42. data/app/helpers/pageflow/external_links/sites_helper.rb +9 -0
  43. data/app/models/pageflow/external_links/site.rb +7 -0
  44. data/app/views/pageflow/external_links/page.html +34 -0
  45. data/app/views/pageflow/external_links/sites/_site.html.erb +10 -0
  46. data/config/locales/de.yml +21 -0
  47. data/config/routes.rb +5 -0
  48. data/db/migrate/20140616153235_create_pageflow_external_links_sites.rb +16 -0
  49. data/lib/pageflow-external-links.rb +6 -0
  50. data/lib/pageflow/external_links/engine.rb +18 -0
  51. data/lib/pageflow/external_links/page_type.rb +15 -0
  52. data/pageflow-external-links.gemspec +27 -0
  53. metadata +193 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MzY5MDM5ZmNhYzQyOTU4NjY5NzdkNjBhYTBjODQ2M2ZmYWRiZDNkZA==
5
+ data.tar.gz: !binary |-
6
+ YzBjZmE0NjcyMGMwOWNlN2E5ZDEwODlmY2FiOWYzOWI0MmFhZTFiZA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YjU3NDk3MGE5NGQzNDBlZTQzMWI0MjIzNjYyZGJjZWZlMGZlYWM0YTI0MjI2
10
+ MTlkM2U1M2NlMjU1NjY4NmIxODdhNzBiMzI4Y2JmYmNkZGVjZTBjODk1MDI4
11
+ Y2MzYzM3YzE2ZjU4ZjhhODZjNGVjYzBjMTQwOTczYTJjOWM3NTE=
12
+ data.tar.gz: !binary |-
13
+ NTY1ODlmYzgzNDZmYTNlMTY1OGNkYWMyZjhhNzkyMGFiMDA3Nzg1YmIyOTBh
14
+ YjA0MmI4ZTJiMjMwMDU2MWJlNTQ2N2NkNjkzMjQ5ZDkxMTc1ZDcxODlhNTc0
15
+ N2FhNTQzMjY0OGRmNWY1OTliOTJhNDRiYzJjZDliMDE3NDAwOTU=
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ *.sqlite3
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ log
19
+ Gemfile.lock
data/.jshintignore ADDED
@@ -0,0 +1 @@
1
+ vendor/assets/javascripts/**
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/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,49 @@
1
+ # Pageflow External Links
2
+
3
+ Page type to display links to external pages.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's `Gemfile`:
8
+
9
+ gem 'pageflow-external-links'
10
+
11
+ Register the page type inside the configure block in `config/initializers/pageflow.rb`
12
+
13
+ Pageflow.configure do |config|
14
+ config.register_page_type(Pageflow::ExternalLinks::PageType.new)
15
+ end
16
+
17
+ Include javascripts and stylesheets:
18
+
19
+ # app/assets/javascripts/pageflow/application.js
20
+ //= require pageflow/external_links
21
+
22
+ # app/assets/javascripts/pageflow/editor.js
23
+ //= require pageflow/external_links/editor
24
+
25
+ # app/assets/stylesheets/pageflow/application.scss.css
26
+ @import "pageflow/external_links";
27
+
28
+ # app/assets/stylesheets/pageflow/editor.scss.css
29
+ @import "pageflow/external_links/editor";
30
+
31
+ Mount the routes in `config/routes.rb`:
32
+
33
+ authenticated do
34
+ mount Pageflow::ExternalLinks::Engine, :at => '/external_links'
35
+ end
36
+
37
+ Install dependencies:
38
+
39
+ bundle install
40
+
41
+ Copy migrations of pageflow-external-links into your project:
42
+
43
+ bundle exec rake pageflow_external_links:install:migrations
44
+
45
+ Migrate the database:
46
+
47
+ bundle exec rake db:migrate
48
+
49
+ Restart the application server.
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,4 @@
1
+ //= require_self
2
+ //= require ./external_links/page_type
3
+
4
+ pageflow.externalLinks = pageflow.externalLinks || {};
@@ -0,0 +1,12 @@
1
+ //= require_self
2
+
3
+ //= require_tree ./editor/models
4
+ //= require_tree ./editor/collections
5
+ //= require_tree ./editor/routers
6
+ //= require_tree ./editor/controllers
7
+ //= require_tree ./editor/templates
8
+ //= require_tree ./editor/views
9
+
10
+ //= require ./editor/config
11
+
12
+ pageflow.externalLinks = pageflow.externalLinks || {};
@@ -0,0 +1,11 @@
1
+ pageflow.externalLinks.SiteReferencesCollection = Backbone.Collection.extend({
2
+ model: pageflow.externalLinks.SiteReference,
3
+
4
+ comparator: function(chapter) {
5
+ return chapter.get('position');
6
+ },
7
+
8
+ saveOrder: function() {
9
+ // no op
10
+ }
11
+ });
@@ -0,0 +1,22 @@
1
+ pageflow.externalLinks.SitesCollection = Backbone.Collection.extend({
2
+ model: pageflow.externalLinks.Site,
3
+
4
+ url: function() {
5
+ return '/external_links/entries/' + pageflow.entry.get('id') + '/sites';
6
+ },
7
+
8
+ getByPermaId: function(permaId) {
9
+ return this.findWhere({perma_id: permaId});
10
+ },
11
+
12
+ ensureFetched: function(callback) {
13
+ var collection = this;
14
+
15
+ this.fetchedPromise = this.fetchedPromise || new $.Deferred(function(deferred) {
16
+ collection.once('sync', deferred.resolve);
17
+ collection.fetch();
18
+ }).promise();
19
+
20
+ return this.fetchedPromise;
21
+ }
22
+ });
@@ -0,0 +1,17 @@
1
+ pageflow.editor.registerPageConfigurationMixin(pageflow.externalLinks.pageConfigurationMixin);
2
+
3
+ pageflow.editor.registerSideBarRouting({
4
+ router: pageflow.externalLinks.SidebarRouter,
5
+ controller: pageflow.externalLinks.SidebarController
6
+ });
7
+
8
+ pageflow.editor.registerFileSelectionHandler('externalLinks.site', pageflow.externalLinks.SiteFileSelectionHandler);
9
+
10
+ pageflow.editor.registerMainMenuItem({
11
+ translationKey: 'pageflow.external_links.manage_sites',
12
+ path: '/external_links/sites'
13
+ });
14
+
15
+ pageflow.editor.addInitializer(function() {
16
+ pageflow.externalLinks.sites = new pageflow.externalLinks.SitesCollection();
17
+ });
@@ -0,0 +1,34 @@
1
+ pageflow.externalLinks.SidebarController = Backbone.Marionette.Controller.extend({
2
+ initialize: function(options) {
3
+ this.region = options.region;
4
+ },
5
+
6
+ sites: function(pageId) {
7
+ var page = pageflow.pages.get(pageId);
8
+ var referer = page ? '/pages/' + page.id + '/links ' : '/';
9
+
10
+ this.region.show(new pageflow.BackButtonDecoratorView({
11
+ referer: referer,
12
+ view: new pageflow.externalLinks.SitesView({
13
+ selectionHandler: page && new pageflow.externalLinks.SiteSelectionHandler({
14
+ page: page
15
+ }),
16
+ page: page,
17
+ referer: referer
18
+ })
19
+ }));
20
+ },
21
+
22
+ site: function(id, pageId, returnTo) {
23
+ var page = pageflow.pages.get(pageId);
24
+ var region = this.region;
25
+
26
+ pageflow.externalLinks.sites.ensureFetched().then(function() {
27
+ region.show(new pageflow.externalLinks.EditSiteView({
28
+ model: pageflow.externalLinks.sites.get(id),
29
+ page: page,
30
+ returnTo: returnTo
31
+ }));
32
+ });
33
+ }
34
+ });
@@ -0,0 +1,38 @@
1
+ pageflow.externalLinks.pageConfigurationMixin = {
2
+ externalSiteReferences: function() {
3
+ var configuration = this;
4
+
5
+ this._externalSiteReferences = this._externalSiteReferences || create();
6
+ return this._externalSiteReferences;
7
+
8
+ function create() {
9
+ var collection = new pageflow.externalLinks.SiteReferencesCollection();
10
+
11
+ pageflow.externalLinks.sites.ensureFetched().then(function() {
12
+ collection.add(siteReferenceAttributes());
13
+
14
+ configuration.listenTo(collection, 'add remove sort', function() {
15
+ configuration.set('linked_external_site_perma_ids', _.map(collection.pluck('site'), function(site) {
16
+ return site.get('perma_id');
17
+ }));
18
+ });
19
+ });
20
+
21
+ return collection;
22
+ }
23
+
24
+ function siteReferenceAttributes() {
25
+ return _.compact(_.map(referencedSitePermaIds(), function(permaId) {
26
+ var site = pageflow.externalLinks.sites.getByPermaId(permaId);
27
+
28
+ return site && {
29
+ site: site
30
+ };
31
+ }));
32
+ }
33
+
34
+ function referencedSitePermaIds() {
35
+ return configuration.get('linked_external_site_perma_ids') || [];
36
+ }
37
+ }
38
+ };
@@ -0,0 +1,25 @@
1
+ pageflow.externalLinks.Site = Backbone.Model.extend({
2
+ modelName: 'site',
3
+ paramRoot: 'site',
4
+ i18nKey: 'site',
5
+
6
+ mixins: [pageflow.failureTracking, pageflow.transientReferences],
7
+
8
+ defaults: {
9
+ 'open_in_new_tab': true
10
+ },
11
+
12
+ initialize: function(attributes, options) {
13
+ this.listenTo(this, 'change', function() {
14
+ this.save();
15
+ });
16
+ },
17
+
18
+ urlRoot: function() {
19
+ return this.isNew() ? this.collection.url() : '/external_links/sites';
20
+ },
21
+
22
+ getThumbnail: function() {
23
+ return this.getReference('thumbnail', pageflow.imageFiles);
24
+ }
25
+ });
@@ -0,0 +1,13 @@
1
+ pageflow.externalLinks.SiteFileSelectionHandler = function(options) {
2
+ this.call = function(file) {
3
+ pageflow.externalLinks.sites.ensureFetched().then(function() {
4
+ var site = pageflow.externalLinks.sites.get(options.id);
5
+ site.setReference(options.attributeName, file);
6
+ });
7
+ };
8
+
9
+ this.getReferer = function() {
10
+ var query = (options.pageId && options.returnTo) ? '/?page=' + options.pageId + '&return_to=' + options.returnTo : '';
11
+ return '/external_links/sites/' + options.id + query;
12
+ };
13
+ };
@@ -0,0 +1,7 @@
1
+ pageflow.externalLinks.SiteReference = Backbone.Model.extend({
2
+ modelName: 'siteReference',
3
+
4
+ initialize: function() {
5
+ this.listenTo(this.get('site'), 'destroy', this.destroy);
6
+ }
7
+ });
@@ -0,0 +1,7 @@
1
+ pageflow.externalLinks.SiteSelectionHandler = function(options) {
2
+ this.call = function(site) {
3
+ options.page.configuration.externalSiteReferences().add({
4
+ site: site
5
+ });
6
+ };
7
+ };
@@ -0,0 +1,8 @@
1
+ pageflow.externalLinks.SidebarRouter = Backbone.Marionette.AppRouter.extend({
2
+ appRoutes: {
3
+ 'external_links/sites': 'sites',
4
+ 'external_links/sites?page=:page_id': 'sites',
5
+ 'external_links/sites/:id': 'site',
6
+ 'external_links/sites/:id/?page=:page_id&return_to=:return_to': 'site',
7
+ }
8
+ });
@@ -0,0 +1,10 @@
1
+ <a class="back">Externe Verweise</a>
2
+ <a class="destroy">Löschen</a>
3
+
4
+ <div class="failure">
5
+ <p>Beim Speichern des externen Verweises ist ein Problem aufgetreten.</p>
6
+ <p class="message"></p>
7
+ <a class="retry" href="">Erneut versuchen</a>
8
+ </div>
9
+
10
+ <div class="form_container"></div>
@@ -0,0 +1,5 @@
1
+ <div class="link-thumbnail"></div>
2
+ <div class="link-details">
3
+ <p class="link-title"></p>
4
+ <p class="link-description"></p>
5
+ </div>
@@ -0,0 +1,7 @@
1
+ <label>
2
+ <span class="name"></span>
3
+ <span class="inline_help"></span>
4
+ </label>
5
+ <ul class="sites outline"></ul>
6
+
7
+ <a href="" class="add_reference">Hinzufügen</a>
@@ -0,0 +1,6 @@
1
+ <a href="">
2
+ <span class="thumbnail"></span>
3
+ <span class="title"></span>
4
+ <span class="failure_icon" title="Beim Speichern der Seite ist ein Fehler aufgetreten." />
5
+ </a>
6
+ <a class="select">Auswählen</a>
@@ -0,0 +1,6 @@
1
+ <a href="">
2
+ <span class="thumbnail"></span>
3
+ <span class="title"></span>
4
+ <a class="edit" title="Bearbeiten"></a>
5
+ <a class="remove" title="Löschen"></a>
6
+ </a>
@@ -0,0 +1 @@
1
+ <a class="add" href="">Hinzufügen</a>
@@ -0,0 +1 @@
1
+ <li class="blank_slate">Es wurden noch keine Seiten erstellt.<li>
@@ -0,0 +1,23 @@
1
+ pageflow.ConfigurationEditorView.register('external_links', {
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
+ imagePositioning: false
12
+ });
13
+ });
14
+
15
+ this.tab('links', function() {
16
+ this.input('linked_external_site_perma_ids', pageflow.externalLinks.SiteReferenceInputView);
17
+ });
18
+
19
+ this.tab('options', function() {
20
+ this.group('options');
21
+ });
22
+ }
23
+ });
@@ -0,0 +1,69 @@
1
+ pageflow.externalLinks.EditSiteView = Backbone.Marionette.Layout.extend({
2
+ template: 'pageflow/external_links/editor/templates/edit_site',
3
+ className: 'edit_external_site',
4
+
5
+ mixins: [pageflow.failureIndicatingView],
6
+
7
+ regions: {
8
+ formContainer: '.form_container'
9
+ },
10
+
11
+ ui: {
12
+ backButton: 'a.back'
13
+ },
14
+
15
+ events: {
16
+ 'click a.back': 'goBack',
17
+ 'click a.destroy': 'destroy',
18
+ },
19
+
20
+ onRender: function() {
21
+ var options = this.options;
22
+ var configurationEditor = new pageflow.ConfigurationEditorView({
23
+ model: this.model
24
+ });
25
+
26
+ configurationEditor.tab('general', function() {
27
+ this.input('url', pageflow.TextInputView, {
28
+ required: true
29
+ });
30
+ this.input('open_in_new_tab', pageflow.CheckBoxInputView);
31
+ this.input('thumbnail', pageflow.FileInputView, {
32
+ collection: pageflow.imageFiles,
33
+ fileSelectionHandler: 'externalLinks.site',
34
+ fileSelectionHandlerOptions: {
35
+ pageId: options.page && options.page.id,
36
+ returnTo: options.returnTo
37
+ },
38
+ imagePositioning: false
39
+ });
40
+ this.input('title', pageflow.TextInputView, {
41
+ required: true
42
+ });
43
+ this.input('description', pageflow.TextAreaInputView, {size: 'short'});
44
+ });
45
+
46
+ if (this.options.returnTo === 'page' && this.options.page) {
47
+ this.ui.backButton.text('Zurück');
48
+ }
49
+
50
+ this.formContainer.show(configurationEditor);
51
+ },
52
+
53
+ destroy: function() {
54
+ if (confirm("Externen Verweis wirklich löschen?\n\nAlle Benutzungen dieses Verweises auf Seiten werden ebenfalls entfernt. Dieser Schritt kann nicht rückgängig gemacht werden.")) {
55
+ this.model.destroy();
56
+ this.goBack();
57
+ }
58
+ },
59
+
60
+ goBack: function() {
61
+ if (this.options.returnTo === 'page' && this.options.page) {
62
+ pageflow.editor.navigate('/pages/' + this.options.page.id + '/links', {trigger: true});
63
+ }
64
+ else {
65
+ var query = this.options.page ? '?page=' + this.options.page.id : '';
66
+ pageflow.editor.navigate('/external_links/sites' + query, {trigger: true});
67
+ }
68
+ }
69
+ });