From 28a4ec4ac2f8d493af130d13a28432d6249f4cfd Mon Sep 17 00:00:00 2001 From: Andrew Bennett Date: Wed, 4 May 2011 19:31:45 -0600 Subject: [PATCH 01/21] Remove git submodule references in cache and add to repo instead. Fixes locomotivecms/engine#49, locomotivecms/engine#55, and locomotivecms/engine#67 --- .../plugins/com.example.aloha.plugins.Product | 1 - .../plugins/com.example.aloha.plugins.Save | 1 - .../plugins/com.gentics.aloha.plugins.Abbr | 1 - .../examples/AlohaAbbr.css | 48 ++++ .../examples/AlohaAbbr.html | 69 +++++ .../i18n/de.dict | 4 + .../i18n/en.dict | 4 + .../com.gentics.aloha.plugins.Abbr/plugin.js | 7 + .../plugins/com.gentics.aloha.plugins.Format | 1 - .../i18n/de.dict | 30 +++ .../i18n/en.dict | 30 +++ .../i18n/eo.dict | 29 +++ .../i18n/fi.dict | 30 +++ .../i18n/fr.dict | 30 +++ .../i18n/it.dict | 30 +++ .../i18n/pl.dict | 30 +++ .../i18n/ru.dict | 30 +++ .../plugin.js | 7 + ...m.gentics.aloha.plugins.HighlightEditables | 1 - .../css/HighlightEditables.css | 14 ++ .../plugin.js | 7 + .../plugins/com.gentics.aloha.plugins.Link | 1 - .../LinkList.js | 7 + .../css/Link.css | 15 ++ .../delicious.js | 7 + .../i18n/de.dict | 4 + .../i18n/en.dict | 4 + .../i18n/fr.dict | 4 + .../i18n/pl.dict | 4 + .../i18n/ru.dict | 4 + .../com.gentics.aloha.plugins.Link/plugin.js | 7 + .../com.gentics.aloha.plugins.LinkChecker | 1 - .../css/LinkChecker.css | 14 ++ .../examples/AlohaLinkChecker.css | 49 ++++ .../examples/AlohaLinkChecker.html | 82 ++++++ .../i18n/en.dict | 27 ++ .../plugin.js | 7 + .../proxy.php | 235 ++++++++++++++++++ .../plugins/com.gentics.aloha.plugins.List | 1 - .../i18n/de.dict | 2 + .../i18n/en.dict | 2 + .../i18n/eo.dict | 2 + .../i18n/fi.dict | 2 + .../i18n/fr.dict | 2 + .../i18n/it.dict | 2 + .../i18n/ru.dict | 2 + .../com.gentics.aloha.plugins.List/plugin.js | 7 + .../plugins/com.gentics.aloha.plugins.Paste | 1 - .../com.gentics.aloha.plugins.Paste/plugin.js | 7 + .../wordpastehandler.js | 7 + .../plugins/com.gentics.aloha.plugins.TOC | 1 - .../i18n/de.dict | 1 + .../i18n/en.dict | 1 + .../com.gentics.aloha.plugins.TOC/plugin.js | 1 + .../plugins/com.gentics.aloha.plugins.Table | 1 - .../i18n/de.dict | 14 ++ .../i18n/en.dict | 14 ++ .../i18n/eo.dict | 12 + .../i18n/fi.dict | 12 + .../i18n/fr.dict | 12 + .../i18n/it.dict | 12 + .../i18n/pl.dict | 12 + .../i18n/ru.dict | 12 + .../com.gentics.aloha.plugins.Table/plugin.js | 7 + .../resources/down.cur | Bin 0 -> 183 bytes .../resources/left.cur | Bin 0 -> 55 bytes .../resources/table.css | 112 +++++++++ .../resources/wai_green.png | Bin 0 -> 51404 bytes .../resources/wai_red.png | Bin 0 -> 48696 bytes 69 files changed, 1126 insertions(+), 11 deletions(-) delete mode 160000 public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Product delete mode 160000 public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Save delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.css create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.html create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/de.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/en.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/plugin.js delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/de.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/en.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/eo.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fi.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fr.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/it.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/pl.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/ru.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/plugin.js delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/css/HighlightEditables.css create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/plugin.js delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/LinkList.js create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/css/Link.css create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/delicious.js create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/i18n/de.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/i18n/en.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/i18n/fr.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/i18n/pl.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/i18n/ru.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/plugin.js delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/css/LinkChecker.css create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.css create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.html create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/i18n/en.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/plugin.js create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/proxy.php delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/de.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/en.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/eo.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fi.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fr.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/it.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/ru.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/plugin.js delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/plugin.js create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/wordpastehandler.js delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/de.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/en.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/plugin.js delete mode 160000 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/de.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/en.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/eo.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fi.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fr.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/it.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/pl.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/ru.dict create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/plugin.js create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/down.cur create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/left.cur create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/table.css create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/wai_green.png create mode 100644 public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/wai_red.png diff --git a/public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Product b/public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Product deleted file mode 160000 index 97cacd37..00000000 --- a/public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Product +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 97cacd37ee095d66b8018c89ac072c783df36840 diff --git a/public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Save b/public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Save deleted file mode 160000 index c574ed11..00000000 --- a/public/javascripts/admin/aloha/plugins/com.example.aloha.plugins.Save +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c574ed110c2cb3fb2927ad2ca529b18522be2f88 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr deleted file mode 160000 index a9b8cd6b..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a9b8cd6b908016f32dcfee138d4b9eea5ed03b5e diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.css b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.css new file mode 100644 index 00000000..84f64efe --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.css @@ -0,0 +1,48 @@ +body { + font-family: sans-serif; +} + +body { + background-color: #ccc; +} + +#bodyContent { + font-size:0.9em; +} + +h1, h2, h3, h4, h5, h6 { + font-family: sans-serif; + padding-bottom:0.1em; + padding-top:0.5em; +} +h1 { + border-bottom:1px solid #AAAAAA; +} + +h1 { font-size: 188%; } +h2 { font-size: 150%; } +h3 { font-size: 132%; } +h4 { font-size: 116%; } +h5 { font-size: 100%; } +h6 { font-size: 80%; } + +#main { + width: 650px; + margin-top: 40px; + margin-left: auto ; + margin-right: auto ; + padding: 70px; + background-color: white; + border-radius: 1px; + -moz-border-radius: 1px; + box-shadow: 5px 5px rgba(0,0,0,0.3); + -webkit-box-shadow: 5px 5px rgba(0,0,0,0.3); + -moz-box-shadow: 5px 5px rgba(0,0,0,0.3); +} + +abbr, acronym +{ + border-bottom: .1em dotted; + cursor: help; +} + diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.html b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.html new file mode 100644 index 00000000..2e0b77f1 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/examples/AlohaAbbr.html @@ -0,0 +1,69 @@ + + + + +Aloha, Abbreviations ! + + + + + + + + + + + + +
+
+
+

Aloha

+

Etymology

+

The word aloha derives from the Proto-Polynesian root *qalofa. It has cognates in other Polynesian languages, such as Samoan alofa +and Māori aroha, also meaning "love."

+

AE is the word's most advanced browser based RTE made with aloha passion.

+

A folk etymology claims that it derives from a compound of the Hawaiian words alo meaning "presence", "front", "face", or "share"; and +ha, meaning "breath of life" or "essence of life." Although alo does indeed mean "presence" etc., the word for breath is spelled with a macron +or kahakō over the a (hā) whereas the word aloha does not have a long a.

+

Usage

+

Before contact with the West, the words used for greeting were welina and anoai. Today, "aloha kakahiaka" is the phrase for "good +morning." "Aloha ʻauinalā" means "good afternoon" and "aloha ahiahi" means "good evening." "Aloha kākou" is a common form of "welcome to all."

+

In modern Hawaiʻi, numerous businesses have aloha in their names, with more than 3 pages of listings in the Oʻahu phone book alone.

+

Trends

+

Recent trends are popularizing the term elsewhere in the United States. Popular entertainer, Broadway star and Hollywood actress Bette +Midler, born in Honolulu, uses the greeting frequently in national appearances. The word was also used frequently in the hit television drama +Hawaii Five-O. In the influential 1982 film comedy Fast Times at Ridgemont High, the eccentric teacher Mr. Hand makes use of the greeting. The +Aloha Spirit is a major concept in Lilo and Stitch, a very popular Disney series of movies and TV shows, set in Hawaiʻi. The drama series Lost, +shot in Hawaiʻi, has a thank you note at the end of the credits saying "We thank the people of Hawaiʻi and their Aloha Spirit". Aloha is a term +also used in the Nickelodeon program Rocket Power.

+
    +
  • Arguably the most famous historical Hawaiian song, "Aloha ʻOe" was written by the last queen of Hawaii, Liliʻuokalani.
  • +
  • The term inspired the name of the ALOHA Protocol introduced in the 1970s by the University of Hawaii.
  • +
  • In Hawaii someone can be said to have or show aloha in the way they treat others; whether family, friend, neighbor or stranger.
  • +
+
+
+
+ + \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/de.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/de.dict new file mode 100644 index 00000000..357c67d6 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/de.dict @@ -0,0 +1,4 @@ +floatingmenu.tab.abbr=Abkürzung +button.addabbr.tooltip=Abkürzung einfügen +button.abbr.tooltip=Als Abkürzung formatieren +newabbr.defaulttext=Abb diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/en.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/en.dict new file mode 100644 index 00000000..59466c89 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/i18n/en.dict @@ -0,0 +1,4 @@ +floatingmenu.tab.abbr=Abbreviation +button.addabbr.tooltip=insert abbreviation +button.abbr.tooltip=format as abbreviation +newabbr.defaulttext=Abbr diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/plugin.js new file mode 100644 index 00000000..575a0312 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Abbr/plugin.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.Abbr=new GENTICS.Aloha.Plugin("com.gentics.aloha.plugins.Abbr");GENTICS.Aloha.Abbr.languages=["en","de"];GENTICS.Aloha.Abbr.config=["abbr"];GENTICS.Aloha.Abbr.init=function(){this.createButtons();this.subscribeEvents();this.bindInteractions()};GENTICS.Aloha.Abbr.createButtons=function(){var that=this;this.formatAbbrButton=new GENTICS.Aloha.ui.Button({iconClass:"GENTICS_button GENTICS_button_abbr",size:"small",onclick:function(){that.formatAbbr()},tooltip:this.i18n("button.abbr.tooltip"),toggle:true});GENTICS.Aloha.FloatingMenu.addButton("GENTICS.Aloha.continuoustext",this.formatAbbrButton,GENTICS.Aloha.i18n(GENTICS.Aloha,"floatingmenu.tab.format"),1);this.insertAbbrButton=new GENTICS.Aloha.ui.Button({iconClass:"GENTICS_button GENTICS_button_abbr",size:"small",onclick:function(){that.insertAbbr(false)},tooltip:this.i18n("button.addabbr.tooltip"),toggle:false});GENTICS.Aloha.FloatingMenu.addButton("GENTICS.Aloha.continuoustext",this.insertAbbrButton,GENTICS.Aloha.i18n(GENTICS.Aloha,"floatingmenu.tab.insert"),1);GENTICS.Aloha.FloatingMenu.createScope(this.getUID("abbr"),"GENTICS.Aloha.continuoustext");this.abbrField=new GENTICS.Aloha.ui.AttributeField({width:320});GENTICS.Aloha.FloatingMenu.addButton(this.getUID("abbr"),this.abbrField,this.i18n("floatingmenu.tab.abbr"),1)};GENTICS.Aloha.Abbr.bindInteractions=function(){var that=this;this.abbrField.addListener("blur",function(obj,event){if(this.getValue()==""){that.removeAbbr()}});for(var i=0;i'+abbrText+"");GENTICS.Utils.Dom.insertIntoDOM(newAbbr,range,jQuery(GENTICS.Aloha.activeEditable.obj));range.startContainer=range.endContainer=newAbbr.contents().get(0);range.startOffset=0;range.endOffset=abbrText.length}else{var newAbbr=jQuery('');GENTICS.Utils.Dom.addMarkup(range,newAbbr,false)}range.select();this.abbrField.focus()};GENTICS.Aloha.Abbr.removeAbbr=function(){var range=GENTICS.Aloha.Selection.getRangeObject();var foundMarkup=this.findAbbrMarkup();if(foundMarkup){GENTICS.Utils.Dom.removeFromDOM(foundMarkup,range,true);GENTICS.Aloha.activeEditable.obj[0].focus();range.select()}};GENTICS.Aloha.Abbr.makeClean=function(obj){}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format deleted file mode 160000 index c71edba4..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c71edba41798a4be621197a7418747252884a34d diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/de.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/de.dict new file mode 100644 index 00000000..467b893e --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/de.dict @@ -0,0 +1,30 @@ +button.b.tooltip=Fett +button.i.tooltip=Kursiv +button.u.tooltip=Unterstrichen +button.cite.tooltip=Zitat +button.q.tooltip= +button.code.tooltip=Code +button.abbr.tooltip=Abkürzung +button.del.tooltip=Durchgestrichen +button.sub.tooltip=Tiefgestellt +button.sup.tooltip=Hochgestellt +button.p.tooltip=Absatz +button.h1.tooltip=Überschrift 1 +button.h2.tooltip=Überschrift 2 +button.h3.tooltip=Überschrift 3 +button.h4.tooltip=Überschrift 4 +button.h5.tooltip=Überschrift 5 +button.h6.tooltip=Überschrift 6 +button.pre.tooltip=Vorformatierter text +button.title.tooltip=Titel +button.removeFormat.tooltip=Formatierung entfernen +button.removeFormat.text=Formatierung entfernen +GENTICS_button_p=GENTICS_button_p_de +GENTICS_button_h1=GENTICS_button_h1_de +GENTICS_button_h2=GENTICS_button_h2_de +GENTICS_button_h3=GENTICS_button_h3_de +GENTICS_button_h4=GENTICS_button_h4_de +GENTICS_button_h5=GENTICS_button_h5_de +GENTICS_button_h6=GENTICS_button_h6_de +GENTICS_button_pre=GENTICS_button_pre_de +GENTICS_button_title=GENTICS_button_title_de \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/en.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/en.dict new file mode 100644 index 00000000..106a1e32 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/en.dict @@ -0,0 +1,30 @@ +button.b.tooltip=Bold +button.i.tooltip=Italic +button.u.tooltip=Underline +button.cite.tooltip=Cite +button.q.tooltip= +button.code.tooltip=Code +button.abbr.tooltip=Abbreviation +button.del.tooltip=Strikethrough +button.sub.tooltip=Subscript +button.sup.tooltip=Superscript +button.p.tooltip=Paragraph +button.h1.tooltip=Heading 1 +button.h2.tooltip=Heading 2 +button.h3.tooltip=Heading 3 +button.h4.tooltip=Heading 4 +button.h5.tooltip=Heading 5 +button.h6.tooltip=Heading 6 +button.pre.tooltip=Pre formated text +button.title.tooltip=Title +button.removeFormat.tooltip=Remove formatting +button.removeFormat.text=Remove formatting +GENTICS_button_p=GENTICS_button_p +GENTICS_button_h1=GENTICS_button_h1 +GENTICS_button_h2=GENTICS_button_h2 +GENTICS_button_h3=GENTICS_button_h3 +GENTICS_button_h4=GENTICS_button_h4 +GENTICS_button_h5=GENTICS_button_h5 +GENTICS_button_h6=GENTICS_button_h6 +GENTICS_button_pre=GENTICS_button_pre +GENTICS_button_title=GENTICS_button_title \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/eo.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/eo.dict new file mode 100644 index 00000000..4cbb70e6 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/eo.dict @@ -0,0 +1,29 @@ +button.i.tooltip=Oblikvigi +button.u.tooltip=Substreki +button.cite.tooltip=Citi +button.q.tooltip= +button.code.tooltip=Kodo +button.abbr.tooltip=Mallongigo +button.del.tooltip=Marki forviita +button.sub.tooltip=Superskripto +button.sup.tooltip=Subskripto +button.p.tooltip=Alineo +button.h1.tooltip=Titolo 1 +button.h2.tooltip=Subtitolo 2 +button.h3.tooltip=Subtitolo 3 +button.h4.tooltip=Subtitolo 4 +button.h5.tooltip=Subtitolo 5 +button.h6.tooltip=Subtitolo 6 +button.pre.tooltip=Antaformatigita teksto +button.title.tooltip=Titolo +button.removeFormat.tooltip=Forvii la formatigon +button.removeFormat.text=Forvii la formatigon +GENTICS_button_p=GENTICS_button_p +GENTICS_button_h1=GENTICS_button_h1 +GENTICS_button_h2=GENTICS_button_h2 +GENTICS_button_h3=GENTICS_button_h3 +GENTICS_button_h4=GENTICS_button_h4 +GENTICS_button_h5=GENTICS_button_h5 +GENTICS_button_h6=GENTICS_button_h6 +GENTICS_button_pre=GENTICS_button_pre +GENTICS_button_title=GENTICS_button_title \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fi.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fi.dict new file mode 100644 index 00000000..ab6cdb83 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fi.dict @@ -0,0 +1,30 @@ +button.b.tooltip=Lihavointi +button.i.tooltip=Kursiivi +button.u.tooltip=Alleviivaus +button.cite.tooltip=Lainaus +button.q.tooltip= +button.code.tooltip=Koodi +button.abbr.tooltip=Lyhennelmä +button.del.tooltip=Yliviivaus +button.sub.tooltip=Alaindeksi +button.sup.tooltip=Yläindeksi +button.p.tooltip=Tekstikappale +button.h1.tooltip=Otsikko 1 +button.h2.tooltip=Otsikko 2 +button.h3.tooltip=Otsikko 3 +button.h4.tooltip=Otsikko 4 +button.h5.tooltip=Otsikko 5 +button.h6.tooltip=Otsikko 6 +button.pre.tooltip=Muotoiltu teksti +button.title.tooltip=Otsikko +button.removeFormat.tooltip=Poista muotoilut +button.removeFormat.text=Poista muotoilut +GENTICS_button_p=GENTICS_button_p +GENTICS_button_h1=GENTICS_button_h1 +GENTICS_button_h2=GENTICS_button_h2 +GENTICS_button_h3=GENTICS_button_h3 +GENTICS_button_h4=GENTICS_button_h4 +GENTICS_button_h5=GENTICS_button_h5 +GENTICS_button_h6=GENTICS_button_h6 +GENTICS_button_pre=GENTICS_button_pre +GENTICS_button_title=GENTICS_button_title diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fr.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fr.dict new file mode 100644 index 00000000..be990cc5 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/fr.dict @@ -0,0 +1,30 @@ +button.b.tooltip=Gras +button.i.tooltip=Italique +button.u.tooltip=Souligner +button.cite.tooltip=Cité +button.q.tooltip=Quote +button.code.tooltip=Code +button.abbr.tooltip=Abréviation +button.del.tooltip=Barré +button.sub.tooltip=Indice +button.sup.tooltip=Exposant +button.p.tooltip=Paragraphe +button.h1.tooltip=Titre1 +button.h2.tooltip=Rubrique2 +button.h3.tooltip=Rubrique3 +button.h4.tooltip=Rubrique4 +button.h5.tooltip=Rubrique5 +button.h6.tooltip=Rubrique6 +button.pre.tooltip=texte préformaté +button.title.tooltip=Titre +button.removeFormat.tooltip=Supprimer le formatage +button.removeFormat.text=Supprimer le formatage +GENTICS_button_p=GENTICS_button_p +GENTICS_button_h1=GENTICS_button_h1 +GENTICS_button_h2=GENTICS_button_h2 +GENTICS_button_h3=GENTICS_button_h3 +GENTICS_button_h4=GENTICS_button_h4 +GENTICS_button_h5=GENTICS_button_h5 +GENTICS_button_h6=GENTICS_button_h6 +GENTICS_button_pre=GENTICS_button_pre +GENTICS_button_title=GENTICS_button_title \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/it.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/it.dict new file mode 100644 index 00000000..f60ccbca --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/it.dict @@ -0,0 +1,30 @@ +button.b.tooltip=Grassetto +button.i.tooltip=Corsivo +button.u.tooltip=Sottolineato +button.cite.tooltip=Citazione +button.q.tooltip= +button.code.tooltip=Codice +button.abbr.tooltip=Abbreviazione +button.del.tooltip=Barrato +button.sub.tooltip=Pedice +button.sup.tooltip=Apice +button.p.tooltip=Paragrafo +button.h1.tooltip=Titolo 1 +button.h2.tooltip=Titolo 2 +button.h3.tooltip=Titolo 3 +button.h4.tooltip=Titolo 4 +button.h5.tooltip=Titolo 5 +button.h6.tooltip=Titolo 6 +button.pre.tooltip=Testo pre formattato +button.title.tooltip=Titolo +button.removeFormat.tooltip=Rimuovi formattazione +button.removeFormat.text=Rimuovi formattazione +GENTICS_button_p=GENTICS_button_p +GENTICS_button_h1=GENTICS_button_h1 +GENTICS_button_h2=GENTICS_button_h2 +GENTICS_button_h3=GENTICS_button_h3 +GENTICS_button_h4=GENTICS_button_h4 +GENTICS_button_h5=GENTICS_button_h5 +GENTICS_button_h6=GENTICS_button_h6 +GENTICS_button_pre=GENTICS_button_pre +GENTICS_button_title=GENTICS_button_title diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/pl.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/pl.dict new file mode 100644 index 00000000..eff1a8d0 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/pl.dict @@ -0,0 +1,30 @@ +button.b.tooltip=Pogrubienie +button.i.tooltip=Kursywa +button.u.tooltip=Podkreślenie +button.cite.tooltip=Cytat +button.q.tooltip= +button.code.tooltip=Kod +button.abbr.tooltip=Skrót +button.del.tooltip=Przekreślenie +button.sub.tooltip=Indeks dolny +button.sup.tooltip=Indeks górny +button.p.tooltip=Paragraf +button.h1.tooltip=Nagłówek 1 +button.h2.tooltip=Nagłówek 2 +button.h3.tooltip=Nagłówek 3 +button.h4.tooltip=Nagłówek 4 +button.h5.tooltip=Nagłówek 5 +button.h6.tooltip=Nagłówek 6 +button.pre.tooltip=Tekst preformatowany +button.title.tooltip=Tytuł +button.removeFormat.tooltip=Usuń formatowanie +button.removeFormat.text=Usuń formatowanie +GENTICS_button_p=GENTICS_button_p +GENTICS_button_h1=GENTICS_button_h1 +GENTICS_button_h2=GENTICS_button_h2 +GENTICS_button_h3=GENTICS_button_h3 +GENTICS_button_h4=GENTICS_button_h4 +GENTICS_button_h5=GENTICS_button_h5 +GENTICS_button_h6=GENTICS_button_h6 +GENTICS_button_pre=GENTICS_button_pre +GENTICS_button_title=GENTICS_button_title \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/ru.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/ru.dict new file mode 100644 index 00000000..8e8618e4 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/i18n/ru.dict @@ -0,0 +1,30 @@ +button.b.tooltip=Полужирный +button.i.tooltip=Курсив +button.u.tooltip=Подчеркивание +button.cite.tooltip=Цитировать +button.q.tooltip=Цитата +button.code.tooltip=Код +button.abbr.tooltip=Аббривиатура +button.del.tooltip=Перечеркивание +button.sub.tooltip=Нижний индекс +button.sup.tooltip=Верхний индекс +button.p.tooltip=Параграф +button.h1.tooltip=Заголовок 1 +button.h2.tooltip=Заголовок 2 +button.h3.tooltip=Заголовок 3 +button.h4.tooltip=Заголовок 4 +button.h5.tooltip=Заголовок 5 +button.h6.tooltip=Заголовок 6 +button.pre.tooltip=Отформатированный текс +button.title.tooltip=Название +button.removeFormat.tooltip=Убрать форматирование +button.removeFormat.text=Убрать форматирование +GENTICS_button_p=GENTICS_button_p +GENTICS_button_h1=GENTICS_button_h1 +GENTICS_button_h2=GENTICS_button_h2 +GENTICS_button_h3=GENTICS_button_h3 +GENTICS_button_h4=GENTICS_button_h4 +GENTICS_button_h5=GENTICS_button_h5 +GENTICS_button_h6=GENTICS_button_h6 +GENTICS_button_pre=GENTICS_button_pre +GENTICS_button_title=GENTICS_button_title \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/plugin.js new file mode 100644 index 00000000..fadf95a4 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Format/plugin.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.Format=new GENTICS.Aloha.Plugin("com.gentics.aloha.plugins.Format");GENTICS.Aloha.Format.languages=["en","de","fr","eo","fi","ru","it","pl"];GENTICS.Aloha.Format.config=["b","i","del","sub","sup","p","title","h1","h2","h3","h4","h5","h6","pre","removeFormat"];GENTICS.Aloha.Format.init=function(){this.initButtons();var that=this;GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"editableActivated",function(e,params){that.applyButtonConfig(params.editable.obj)})};GENTICS.Aloha.Format.applyButtonConfig=function(obj){config=this.getEditableConfig(obj);for(var button in this.buttons){if(jQuery.inArray(button,config)!=-1){this.buttons[button].button.show()}else{this.buttons[button].button.hide()}}for(var i in this.multiSplitItems){if(jQuery.inArray(this.multiSplitItems[i].name,config)!=-1){this.multiSplitButton.extButton.showItem(this.multiSplitItems[i].name)}else{this.multiSplitButton.extButton.hideItem(this.multiSplitItems[i].name)}}};GENTICS.Aloha.Format.initButtons=function(){var scope="GENTICS.Aloha.continuoustext";this.buttons={};var that=this;this.multiSplitItems=new Array();this.multiSplitButton;jQuery.each(GENTICS.Aloha.Format.config,function(j,button){switch(button){case"b":case"i":case"cite":case"q":case"code":case"abbr":case"del":case"sub":case"sup":that.buttons[button]={button:new GENTICS.Aloha.ui.Button({iconClass:"GENTICS_button GENTICS_button_"+button,size:"small",onclick:function(){if(GENTICS.Aloha.activeEditable){GENTICS.Aloha.activeEditable.obj[0].focus()}var markup=jQuery("<"+button+">");var rangeObject=GENTICS.Aloha.Selection.rangeObject;var foundMarkup=rangeObject.findMarkup(function(){return this.nodeName.toLowerCase()==markup.get(0).nodeName.toLowerCase()},GENTICS.Aloha.activeEditable.obj);if(foundMarkup){if(rangeObject.isCollapsed()){GENTICS.Utils.Dom.removeFromDOM(foundMarkup,rangeObject,true)}else{GENTICS.Utils.Dom.removeMarkup(rangeObject,markup,GENTICS.Aloha.activeEditable.obj)}}else{if(rangeObject.isCollapsed()){GENTICS.Utils.Dom.extendToWord(rangeObject)}GENTICS.Utils.Dom.addMarkup(rangeObject,markup)}rangeObject.select();return false},tooltip:that.i18n("button."+button+".tooltip"),toggle:true}),markup:jQuery("<"+button+">")};GENTICS.Aloha.FloatingMenu.addButton(scope,that.buttons[button].button,GENTICS.Aloha.i18n(GENTICS.Aloha,"floatingmenu.tab.format"),1);break;case"p":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"pre":that.multiSplitItems.push({name:button,tooltip:that.i18n("button."+button+".tooltip"),iconClass:"GENTICS_button "+that.i18n("GENTICS_button_"+button),markup:jQuery("<"+button+">"),click:function(){if(GENTICS.Aloha.activeEditable){GENTICS.Aloha.activeEditable.obj[0].focus()}GENTICS.Aloha.Selection.changeMarkupOnSelection(jQuery("<"+button+">"))}});break;case"removeFormat":that.multiSplitItems.push({name:button,text:that.i18n("button."+button+".text"),tooltip:that.i18n("button."+button+".tooltip"),iconClass:"GENTICS_button GENTICS_button_"+button,wide:true,click:function(){GENTICS.Aloha.Format.removeFormat()}});break;default:GENTICS.Aloha.log("warn",this,'Button "'+button+'" is not defined');break}});if(this.multiSplitItems.length>0){this.multiSplitButton=new GENTICS.Aloha.ui.MultiSplitButton({items:this.multiSplitItems});GENTICS.Aloha.FloatingMenu.addButton(scope,this.multiSplitButton,GENTICS.Aloha.i18n(GENTICS.Aloha,"floatingmenu.tab.format"),3)}GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"selectionChanged",function(event,rangeObject){jQuery.each(that.buttons,function(index,button){for(var i=0;i0){var foundMultiSplit=false;for(var i=0;i

"));var formats=["b","i","cite","q","code","abbr","del","sub","sup"];var rangeObject=GENTICS.Aloha.Selection.rangeObject;var startObj=jQuery(rangeObject.startContainer);var limitObj=jQuery(rangeObject.limitObject);if(rangeObject.isCollapsed()||startObj===limitObj){return}var parent=startObj.parent();while(parent.get(0)!==limitObj.get(0)){var index=formats.indexOf(parent.get(0).nodeName.toLowerCase());parent=parent.parent();if(index!=-1){GENTICS.Aloha.Selection.changeMarkupOnSelection(jQuery("<"+formats[index]+">"));formats.splice(index,1)}}for(var i in formats){GENTICS.Aloha.Selection.changeMarkupOnSelection(jQuery("<"+formats[i]+">"));GENTICS.Aloha.Selection.changeMarkupOnSelection(jQuery("<"+formats[i]+">"))}};GENTICS.Aloha.Format.toString=function(){return"com.gentics.aloha.plugins.Format"}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables deleted file mode 160000 index 11d45d8d..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 11d45d8df725f0e15501c1447975b84473b8c116 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/css/HighlightEditables.css b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/css/HighlightEditables.css new file mode 100644 index 00000000..ce27e7cf --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/css/HighlightEditables.css @@ -0,0 +1,14 @@ +/*! +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ + +.GENTICS_editable_highlight { + outline: #FFE767 solid 5px !important; +} + +.GENTICS_editable_active, .GENTICS_editable_active[contenteditable=true]:focus { + outline: #B7D6FA solid 5px !important; +} diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/plugin.js new file mode 100644 index 00000000..ebb07b32 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.HighlightEditables/plugin.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.HighlightEditables=new GENTICS.Aloha.Plugin("com.gentics.aloha.plugins.highlighteditables");GENTICS.Aloha.HighlightEditables.init=function(){var that=this;GENTICS.Utils.Position.addMouseMoveCallback(function(){for(var i=0;i-1)&&(!p.inFolderId||p.inFolderId==e.parentId))});callback.call(this,d)};GENTICS.Aloha.Repositories.LinkList.getChildren=function(p,callback){var d=[];for(e in this.folder){var l=this.folder[e].parentId;if(typeof this.folder[e]!="function"&&(this.folder[e].parentId==p.inFolderId||(!this.folder[e].parentId&&p.inFolderId==this.repositoryId))){d.push(this.folder[e])}}callback.call(this,d)};GENTICS.Aloha.Repositories.LinkList.parseUri=function(str){var o={strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}},m=o.parser[o.strictMode?"strict":"loose"].exec(str),uri={},i=14;while(i--){uri[o.key[i]]=m[i]||""}uri[o.q.name]={};uri[o.key[12]].replace(o.q.parser,function($0,$1,$2){if($1){uri[o.q.name][$1]=$2}});return uri}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/css/Link.css b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/css/Link.css new file mode 100644 index 00000000..4eb46564 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/css/Link.css @@ -0,0 +1,15 @@ +/*! +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ + +.GENTICS_link_pointer { + cursor: pointer; +} + +.GENTICS_link_text { + cursor: text; +} + diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/delicious.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/delicious.js new file mode 100644 index 00000000..43f61d05 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Link/delicious.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +if(!GENTICS.Aloha.Repositories){GENTICS.Aloha.Repositories={}}GENTICS.Aloha.Repositories.delicious=new GENTICS.Aloha.Repository("com.gentics.aloha.repositories.delicious");GENTICS.Aloha.Repositories.delicious.settings.username="draftkraft";GENTICS.Aloha.Repositories.delicious.settings.weight=0.35;GENTICS.Aloha.Repositories.delicious.init=function(){var that=this;if(this.settings.weight+0.15>1){this.settings.weight=1-0.15}this.deliciousURL="http://feeds.delicious.com/v2/json/";if(this.settings.username){this.deliciousURL+=this.settings.username+"/";this.repositoryName="deliciuos/"+this.settings.username;this.tags=[];jQuery.ajax({type:"GET",dataType:"jsonp",url:"http://feeds.delicious.com/v2/json/tags/"+that.settings.username,success:function(data){for(var tag in data){that.tags.push(tag)}}})}else{this.repositoryName="deliciuos/"+popular;this.deliciousURL+="tag/"}};GENTICS.Aloha.Repositories.delicious.query=function(p,callback){var that=this;if(p.objectTypeFilter&&jQuery.inArray("website",p.objectTypeFilter)==-1){callback.call(this,[])}else{var tags=[];if(this.settings.username){var queryTags=p.queryString?p.queryString.split(" "):[];for(var i=0;i0){tags.push(newtags[0])}}else{tags.push(queryTag)}}}else{tags=p.queryString.split(" ")}var folderTags=p.inFolderId?p.inFolderId.split("+"):[];jQuery.extend(tags,folderTags);if(p.queryString&&tags.length==0){callback.call(that,[]);return}jQuery.ajax({type:"GET",dataType:"jsonp",url:that.deliciousURL+tags.join("+"),success:function(data){var items=[];for(var i=0;i'+linkText+"");GENTICS.Utils.Dom.insertIntoDOM(newLink,range,jQuery(GENTICS.Aloha.activeEditable.obj));range.startContainer=range.endContainer=newLink.contents().get(0);range.startOffset=0;range.endOffset=linkText.length}else{var newLink=jQuery('');GENTICS.Utils.Dom.addMarkup(range,newLink,false)}range.select();this.hrefField.focus();this.hrefChange()};GENTICS.Aloha.Link.removeLink=function(){var range=GENTICS.Aloha.Selection.getRangeObject();var foundMarkup=this.findLinkMarkup();if(foundMarkup){GENTICS.Utils.Dom.removeFromDOM(foundMarkup,range,true);GENTICS.Aloha.activeEditable.obj[0].focus();range.select()}};GENTICS.Aloha.Link.hrefChange=function(){this.hrefField.setAttribute("target",this.target,this.targetregex,this.hrefField.getQueryValue());this.hrefField.setAttribute("class",this.cssclass,this.cssclassregex,this.hrefField.getQueryValue());if(typeof this.onHrefChange=="function"){this.onHrefChange.call(this,this.hrefField.getTargetObject(),this.hrefField.getQueryValue(),this.hrefField.getItem())}GENTICS.Aloha.EventRegistry.trigger(new GENTICS.Aloha.Event("hrefChanged",GENTICS.Aloha,{obj:this.hrefField.getTargetObject(),href:this.hrefField.getQueryValue(),item:this.hrefField.getItem()}))};GENTICS.Aloha.Link.makeClean=function(obj){obj.find("a").each(function(){jQuery(this).removeClass("GENTICS_link_pointer");jQuery(this).removeClass("GENTICS_link_text")})}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker deleted file mode 160000 index b8bac9b6..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b8bac9b6b11ddd2dfa141053229c17ca209425a3 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/css/LinkChecker.css b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/css/LinkChecker.css new file mode 100644 index 00000000..797c0bea --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/css/LinkChecker.css @@ -0,0 +1,14 @@ +/*! +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ + +.GENTICS_link_error { + color: red !important; +} + +.GENTICS_link_warn { + color: red !important; +} diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.css b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.css new file mode 100644 index 00000000..2339c4a2 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.css @@ -0,0 +1,49 @@ +body { + font-family: sans-serif; +} + +body { + background-color: #ccc; +} + +#bodyContent { + font-size:0.9em; +} + +h1, h2, h3, h4, h5, h6 { + font-family: sans-serif; + padding-bottom:0.1em; + padding-top:0.5em; +} +h1 { + border-bottom:1px solid #AAAAAA; +} + +h1 { font-size: 188%; } +h2 { font-size: 150%; } +h3 { font-size: 132%; } +h4 { font-size: 116%; } +h5 { font-size: 100%; } +h6 { font-size: 80%; } + +#main { + width: 650px; + margin-top: 40px; + margin-left: auto ; + margin-right: auto ; + padding: 70px; + background-color: white; + border-radius: 1px; + -moz-border-radius: 1px; + box-shadow: 5px 5px rgba(0,0,0,0.3); + -webkit-box-shadow: 5px 5px rgba(0,0,0,0.3); + -moz-box-shadow: 5px 5px rgba(0,0,0,0.3); +} + +.GENTICS_link_error { + color: red; +} + +.GENTICS_link_warn { + color: orange; +} \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.html b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.html new file mode 100644 index 00000000..cdc04556 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/examples/AlohaLinkChecker.html @@ -0,0 +1,82 @@ + + + + +Aloha, link checker! + + + + + + + + + + + + + +
+
+
+

Aloha

+

Etymology

+

The word aloha derives from the Proto-Polynesian root *qalofa. It has cognates in other Polynesian languages, such as Samoan alofa +and Māori aroha, also meaning "love."

+

invalid Aloha Editor is the word's most advanced browser based Editor made with aloha passion.

+

A folk etymology claims that it derives from a compound of the Hawaiian words alo meaning "presence", "front", "face", or "share"; and +ha, meaning "breath of life" or "essence of life." Although alo does indeed mean "presence" etc., the word for breath is spelled with a macron +or kahakō over the a (hā) whereas the word aloha does not have a long a.

+

Links are the web's Rocket Power.

+

Usage

+

Before contact with the West, the words used for greeting were welina and anoai. Today, "aloha kakahiaka" is the phrase for "good +morning." "Aloha ʻauinalā" means "good afternoon" and "aloha ahiahi" means "good evening." "Aloha kākou" is a common form of "welcome to all."

+

In modern Hawaiʻi, numerous businesses have aloha in their names, with more than 3 pages of listings in the Oʻahu phone book alone.

+

Trends

+

Recent trends are popularizing the term elsewhere in the United States. Popular entertainer, Broadway star and Hollywood actress Bette +Midler, born in Honolulu, uses the greeting frequently in national appearances. The word was also used frequently in the hit television drama +Hawaii Five-O. In the influential 1982 film comedy Fast Times at Ridgemont High, the eccentric teacher Mr. Hand makes use of the greeting. The +Aloha Spirit is a major concept in Lilo and Stitch, a very popular Disney series of movies and TV shows, set in Hawaiʻi. The drama series Lost, +shot in Hawaiʻi, has a thank you note at the end of the credits saying "We thank the people of Hawaiʻi and their Aloha Spirit". Aloha is a term +also used in the Nickelodeon program Rocket Power.

+
    +
  • Arguably the most famous historical Hawaiian song, "Aloha ʻOe" was written by the last queen of Hawaii, Liliʻuokalani.
  • +
  • The term inspired the name of the ALOHA Protocol introduced in the 1970s by the University of Hawaii.
  • +
  • In Hawaii someone can be said to have or show aloha in the way they treat others; whether family, friend, neighbor or stranger.
  • +
+
+
+
+ + \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/i18n/en.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/i18n/en.dict new file mode 100644 index 00000000..1e2a22b5 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/i18n/en.dict @@ -0,0 +1,27 @@ + +error.0=An Error occurred checking this URL. +error.400=Bad Request. The request cannot be fulfilled due to bad syntax. +error.401=Unauthorized. Authentication has failed or not yet been provided. +error.402=Payment Required. +error.403=Forbidden. The request was a legal request, but the server is refusing to respond to it. +error.404=Not Found. The requested resource could not be found, but may be available in the future. +error.405=Method Not Allowed. +error.406=Not Acceptable. Your browser does not support the content. +error.407=Proxy Authentication Required. +error.408=Request Timeout. The server timed out waiting for the request. +error.409=Conflict in the request. +error.410=This resource is gone. +error.411=Length Required by server. This Link may work in the browsers. +error.412=Precondition Failed. This Link may work in the browsers. +error.413=Request Entity Too Large. The request is larger than the server is willing or able to process. +error.414=Request-URI Too Long. The URI provided was too long for the server to process. +error.415=Unsupported Media Type. The request entity has a media type which the server or resource does not support. +error.416=Requested Range Not Satisfiable. The client has asked for a portion of the file, but the server cannot supply that portion. +error.417=Expectation Failed. The server cannot meet the requirements of your browser. +error.418=I'm a teapot. ;-) +error.500=Internal Server Error. A generic error message, given when no more specific message is suitable. +error.501=Not Implemented. The server either does not recognise the request method, or it lacks the ability to fulfill the request. +error.502=Bad Gateway. The server was acting as a gateway or proxy and received an invalid response from the upstream server. +error.503=Service Unavailable. The server is currently unavailable (because it is overloaded or down for maintenance). Generally, this is a temporary state. +error.504=Gateway Timeout. The server was acting as a gateway or proxy and did not receive a timely response from the upstream server. +error.505=HTTP Version Not Supported. The server does not support the HTTP protocol version used in the request. diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/plugin.js new file mode 100644 index 00000000..822ab18a --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/plugin.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.LinkChecker=new GENTICS.Aloha.Plugin("com.gentics.aloha.plugins.LinkChecker");GENTICS.Aloha.LinkChecker.languages=["en"];GENTICS.Aloha.LinkChecker.errorCodes=[400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,500,501,502,503,504,505,506];GENTICS.Aloha.LinkChecker.warningCodes=[404,411,412,413,500,503,504,505];GENTICS.Aloha.LinkChecker.init=function(){this.proxyUrl=null;if(GENTICS.Aloha.LinkChecker.settings.proxyUrl!=undefined){this.proxyUrl=GENTICS.Aloha.LinkChecker.settings.proxyUrl}this.timer={};this.xhr={};var that=this;GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"editableActivated",function(jEvent,aEvent){aEvent.editable.obj.find("a").each(function(){that.checkLink(this,jQuery(this).attr("href"),0)})});GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"editableDeactivated",function(jEvent,aEvent){that.makeClean(aEvent.editable.obj)});GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"hrefChanged",function(jEvent,aEvent){that.checkLink(aEvent.obj,"hrefChanged")})};GENTICS.Aloha.LinkChecker.checkLink=function(obj,scope,delay,timeout){var that=this;var url=jQuery(obj).attr("href");var cleanUrl=url;if(typeof url=="string"&&!/^http/.test(url.toLowerCase())){this.makeCleanLink(obj);return}if(this.proxyUrl){url=this.proxyUrl+url}if(this.xhr[scope]){this.xhr[scope].abort();this.xhr[scope]=undefined}this.timer[scope]=this.urlExists(url,function(xhr){that.makeCleanLink(obj)},function(xhr){if(obj){if(jQuery.inArray(xhr.status,that.errorCodes)>=0){var e=xhr.status}else{var e="0"}var o=jQuery(obj);if(o.attr("title")&&!o.attr("data-invalid")){o.attr("data-title",o.attr("title"))}o.attr("data-invalid","true");o.attr("title",cleanUrl+". "+that.i18n("error."+e));if(jQuery.inArray(xhr.status,that.warningCodes)>=0){o.addClass("GENTICS_link_warn")}else{o.addClass("GENTICS_link_error")}}},scope,timeout,delay)};GENTICS.Aloha.LinkChecker.urlExists=function(url,successFunc,failureFunc,scope,timeout,delay){var that=this;clearTimeout(this.timer[scope]);delay=(delay!=null&&delay!=undefined)?delay:700;var newTimer=setTimeout(function(){that.xhr[scope]=jQuery.ajax({url:url,timeout:timeout?10000:timeout,type:"HEAD",complete:function(xhr){clearTimeout(newTimer);try{if(xhr.status<400){successFunc.call(this,xhr)}else{failureFunc.call(this,xhr)}}catch(e){failureFunc.call(this,{status:0})}}})},delay);return newTimer};GENTICS.Aloha.LinkChecker.makeCleanLink=function(obj){if(obj){var o=jQuery(obj);if(o.attr("data-title")){o.attr("title",o.attr("data-title"))}else{o.removeAttr("title")}o.removeAttr("data-title");o.removeAttr("data-invalid");o.removeClass("GENTICS_link_error");o.removeClass("GENTICS_link_warn")}};GENTICS.Aloha.LinkChecker.makeClean=function(editable){var that=this;editable.find("a").each(function(){that.makeCleanLink(this)})};GENTICS.Aloha.LinkChecker.urlencode=function(str){str=(str+"").toString();return encodeURIComponent(str).replace(/!/g,"%21").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\*/g,"%2A").replace(/%20/g,"+")}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/proxy.php b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/proxy.php new file mode 100644 index 00000000..76208f9e --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.LinkChecker/proxy.php @@ -0,0 +1,235 @@ + 'X');}; + * https url example: https://google.com/adsense + * + */ + +// for debugging +//$_SERVER['SERVER_PROTOCOL'] = 'HTTP/1.0'; +//$_SERVER['REQUEST_METHOD'] = 'HEAD'; +//error_reporting(E_ALL); + +$request = array( + 'method' => $_SERVER['REQUEST_METHOD'], + 'protocol' => $_SERVER['SERVER_PROTOCOL'], + 'headers' => getallheaders(), + //possibly use $HTTP_RAW_POST_DATA if available + 'payload' => http_build_query($_POST), +); + +// read url parameter +if (array_key_exists('url', $_GET)) { + $request['url'] = urldecode($_GET['url']); +} else { + header("HTTP/1.0 400 Bad Request"); + echo "Gentics AJAX Gateway failed because parameter url is missing."; + exit(); +} + +// check if link exists +$response = http_request($request); + +// Note HEAD does not always work even if specified... +// We use HEAD for Linkchecking so we do a 2nd request. +if (strtoupper($method) == 'HEAD' && (int)$response['status'] >= 400 ) { + + $request['method'] = 'GET'; + $response = http_request($request); + + //since we handle a HEAD, we don't need to proxy any contents + fclose($response['socket']); + $response['socket'] = null; +} + +// forward each returned header... +foreach ($response['headers'] as $key => $value) { + header("$key: $value"); +} + +//there is no need to specify a content length since we don't do keep +//alive, and this can cause problems for integration (e.g. gzip output, +//which would change the content length) +header('Content-Length:'); + +// output the contents if any +if (null !== $response['socket']) { + fpassthru($response['socket']); + fclose($response['socket']); +} + +exit; + +/** + * Query an HTTP(S) URL with the given request parameters and return the + * response headers and status code. The socket is returned as well and + * will point to the begining of the response payload (after all headers + * have been read), and must be closed with fclose(). + * @param $url the request URL + * @param $request the request method may optionally be overridden. + * @param $timeout connection and read timeout in seconds + */ +function http_request($request, $timeout = 5) { + + $url = $request['url']; + // Extract the hostname from url + $parts = parse_url($url); + if (array_key_exists('host', $parts)) { + $remote = $parts['host']; + } else { + return myErrorHandler("url ($url) has no host. Is it relative?"); + } + if (array_key_exists('port', $parts)) { + $port = $parts['port']; + } else { + $port = 0; + } + + // Beware that RFC2616 (HTTP/1.1) defines header fields as case-insensitive entities. + $request_headers = ""; + foreach ($request['headers'] as $name => $value) { + switch (strtolower($name)) { + //ommit some headers + case "keep-alive": + case "connection": + case "cookie": + //TPDP: we don't handle any compressions encodings. this is only + //a problem if client communication is already compressed (which + //would double compress the content, once from the remote server + //to us, and once from us to the client, but the client would + //de-compress only once). + case "accept-encoding": + break; + // correct the host parameter + case "host": + $host_info = $remote; + if ($port) { + $host_info .= ':' . $port; + } + $request_headers .= "$name: $host_info\r\n"; + break; + // forward all other headers + default: + $request_headers .= "$name: $value\r\n"; + break; + } + } + + //set fsockopen transport scheme, and the default port + switch (strtolower($parts['scheme'])) { + case 'https': + $scheme = 'ssl://'; + if ( ! $port ) $port = 443; + break; + case 'http': + $scheme = ''; + if ( ! $port ) $port = 80; + break; + default: + //some other transports are available but not really supported + //by this script: http://php.net/manual/en/transports.inet.php + $scheme = $parts['scheme'] . '://'; + if ( ! $port ) { + return myErrorHandler("Unknown scheme ($scheme) and no port."); + } + break; + } + + //we make the request with socket operations since we don't want to + //depend on the curl extension, and the higher level wrappers don't + //give us usable error information. + $sock = @fsockopen("$scheme$remote", $port, $errno, $errstr, $timeout); + if ( ! $sock ) { + return myErrorHandler("Unable to open URL ($url): $errstr"); + } + + //timeout in fsockopen is only for the connection, the following is + //for reading the content + stream_set_timeout($sock, $timeout); + + //absolute url should only be specified for proxy requests + if (array_key_exists('path', $parts)) { + $path_info = $parts['path']; + } else { + $path_info = '/'; + } + + if (array_key_exists('query', $parts)) $path_info .= '?' . $parts['query']; + if (array_key_exists('fragment', $parts)) $path_info .= '#' . $parts['fragment']; + + $out = $request["method"]." ".$path_info." ".$request["protocol"]."\r\n" + . $request_headers + . "Connection: Close\r\n\r\n"; + fwrite($sock, $out); + fwrite($sock, $request['payload']); + + $header_str = stream_get_line($sock, 1024*16, "\r\n\r\n"); + $headers = http_parse_headers($header_str); + + // get http status + preg_match('|HTTP/\d+\.\d+\s+(\d+)\s+.*|i',$headers[0],$match); + $status = $match[1]; + + return array('headers' => $headers, 'socket' => $sock, 'status' => $status); +} + +/** + * Parses a string containing multiple HTTP header lines into an array + * of key => values. + * Inspired by HTTP::Daemon (CPAN). + */ +function http_parse_headers($header_str) { + $headers = array(); + + //ignore leading blank lines + $header_str = preg_replace("/^(?:\x0D?\x0A)+/", '', $header_str); + + while (preg_match("/^([^\x0A]*?)\x0D?(?:\x0A|\$)/", $header_str, $matches)) { + $header_str = substr($header_str, strlen($matches[0])); + $header_line = $matches[1]; + + if (empty($headers)) { + // the status line + $headers[] = $header_line; + } + elseif (preg_match('/^([^:\s]+)\s*:\s*(.*)/', $header_line, $matches)) { + if (isset($key)) { + //previous header is finished (was potentially multi-line) + $headers[$key] = $val; + } + list(,$key,$val) = $matches; + } + elseif (preg_match('/^\s+(.*)/', $header_line, $matches)) { + //continue a multi-line header + $val .= " ".$matches[1]; + } + else { + //empty (possibly malformed) header signals the end of all headers + break; + } + } + if (isset($key)) { + $headers[$key] = $val; + } + return $headers; +} + +function myErrorHandler($msg) +{ + // 500 could be misleading... + // Should we return a special Error when a proxy error occurs? + header("HTTP/1.0 500 Internal Error"); + echo "Gentics Aloha Editor AJAX Gateway Error: $msg"; + exit(); +} + +//EOF diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List deleted file mode 160000 index ada3208a..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ada3208a19a31251ad0a58f136bbb09fea68fd70 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/de.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/de.dict new file mode 100644 index 00000000..cdd04e95 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/de.dict @@ -0,0 +1,2 @@ +button.createulist.tooltip=Unsortierte Liste einfügen +button.createolist.tooltip=Sortierte Liste einfügen diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/en.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/en.dict new file mode 100644 index 00000000..31847e05 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/en.dict @@ -0,0 +1,2 @@ +button.createulist.tooltip=Insert Unordered List +button.createolist.tooltip=Insert Ordered List diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/eo.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/eo.dict new file mode 100644 index 00000000..9542e0d4 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/eo.dict @@ -0,0 +1,2 @@ +button.createulist.tooltip=Enmeti senordan liston +button.createolist.tooltip=Enmeti ordan liston diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fi.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fi.dict new file mode 100644 index 00000000..deadc8f4 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fi.dict @@ -0,0 +1,2 @@ +button.createulist.tooltip=Lisää järjestelemätön lista +button.createolist.tooltip=Lisää järjestelty lista diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fr.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fr.dict new file mode 100644 index 00000000..62568897 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/fr.dict @@ -0,0 +1,2 @@ +button.createulist.tooltip=Insérer une liste non ordonnée +button.createolist.tooltip=Insérer liste ordonnée diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/it.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/it.dict new file mode 100644 index 00000000..812df235 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/it.dict @@ -0,0 +1,2 @@ +button.createulist.tooltip=Inserisci una lista +button.createolist.tooltip=Inserisci una lista numerata diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/ru.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/ru.dict new file mode 100644 index 00000000..7b61c3bb --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/i18n/ru.dict @@ -0,0 +1,2 @@ +button.createulist.tooltip=Вставить Список +button.createolist.tooltip=Вставить Упорядоченный Список \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/plugin.js new file mode 100644 index 00000000..b85d58c4 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.List/plugin.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.ListPlugin=new GENTICS.Aloha.Plugin("com.gentics.aloha.plugins.List");GENTICS.Aloha.ListPlugin.languages=["en","de","fr","eo","fi","ru","it"];GENTICS.Aloha.ListPlugin.config=["ul","ol"];GENTICS.Aloha.ListPlugin.transformableElements={p:true,h1:true,h2:true,h3:true,h4:true,h5:true,h6:true,ul:true,ol:true};GENTICS.Aloha.ListPlugin.init=function(){var that=this;this.createUnorderedListButton=new GENTICS.Aloha.ui.Button({iconClass:"GENTICS_button GENTICS_button_ul",size:"small",tooltip:this.i18n("button.createulist.tooltip"),toggle:true,onclick:function(element,event){that.transformList(false)}});GENTICS.Aloha.FloatingMenu.addButton("GENTICS.Aloha.continuoustext",this.createUnorderedListButton,GENTICS.Aloha.i18n(GENTICS.Aloha,"floatingmenu.tab.format"),1);this.createOrderedListButton=new GENTICS.Aloha.ui.Button({iconClass:"GENTICS_button GENTICS_button_ol",size:"small",tooltip:this.i18n("button.createolist.tooltip"),toggle:true,onclick:function(element,event){that.transformList(true)}});GENTICS.Aloha.FloatingMenu.addButton("GENTICS.Aloha.continuoustext",this.createOrderedListButton,GENTICS.Aloha.i18n(GENTICS.Aloha,"floatingmenu.tab.format"),1);GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"selectionChanged",function(event,rangeObject){that.createUnorderedListButton.setPressed(false);that.createOrderedListButton.setPressed(false);for(var i=0;i"))){that.createUnorderedListButton.setPressed(true);break}if(GENTICS.Aloha.Selection.standardTextLevelSemanticsComparator(effectiveMarkup,jQuery("
    "))){that.createOrderedListButton.setPressed(true);break}}if(GENTICS.Aloha.activeEditable){that.applyButtonConfig(GENTICS.Aloha.activeEditable.obj)}GENTICS.Aloha.FloatingMenu.doLayout()});GENTICS.Aloha.Markup.addKeyHandler(9,function(event){return that.processTab(event)})};GENTICS.Aloha.ListPlugin.applyButtonConfig=function(obj){var config=this.getEditableConfig(obj);if(GENTICS.Aloha.Selection.rangeObject.unmodifiableMarkupAtStart[0]){if(jQuery.inArray("ul",config)!=-1&&GENTICS.Aloha.Selection.canTag1WrapTag2(GENTICS.Aloha.Selection.rangeObject.unmodifiableMarkupAtStart[0].nodeName,"ul")!=-1){this.createUnorderedListButton.show()}else{this.createUnorderedListButton.hide()}if(jQuery.inArray("ol",config)!=-1&&GENTICS.Aloha.Selection.canTag1WrapTag2(GENTICS.Aloha.Selection.rangeObject.unmodifiableMarkupAtStart[0].nodeName,"ol")!=-1){this.createOrderedListButton.show()}else{this.createOrderedListButton.hide()}}};GENTICS.Aloha.ListPlugin.processTab=function(event){switch(event.keyCode){case 9:if(event.shiftKey){return this.outdentList()}else{return this.indentList()}}return true};GENTICS.Aloha.ListPlugin.getStartingDomObjectToTransform=function(){var rangeObject=GENTICS.Aloha.Selection.rangeObject;for(var i=0;i

    "));domToTransform=this.getStartingDomObjectToTransform();if(!domToTransform){GENTICS.Aloha.Log.error(this,"Could not transform selection into a list");return}}var nodeName=domToTransform.nodeName.toLowerCase();if(nodeName=="ul"&&!ordered){var jqList=jQuery(domToTransform);var jqParentList=jqList.parent();if(jqParentList.length>0&&GENTICS.Utils.Dom.isListElement(jqParentList.get(0))){jqList.children().unwrap()}else{var jqToTransform=jQuery(domToTransform);jQuery.each(jqToTransform.children("li"),function(index,li){var newPara=GENTICS.Aloha.Markup.transformDomObject(li,"p");newPara.after(newPara.children("ol,ul"))});jqToTransform.children().unwrap()}}else{if(nodeName=="ul"&&ordered){GENTICS.Aloha.Markup.transformDomObject(domToTransform,"ol");this.mergeAdjacentLists(jQuery(domToTransform))}else{if(nodeName=="ol"&&!ordered){GENTICS.Aloha.Markup.transformDomObject(domToTransform,"ul");this.mergeAdjacentLists(jQuery(domToTransform))}else{if(nodeName=="ol"&&ordered){var jqList=jQuery(domToTransform);var jqParentList=jqList.parent();if(jqParentList.length>0&&GENTICS.Utils.Dom.isListElement(jqParentList.get(0))){jqList.children().unwrap()}else{var jqToTransform=jQuery(domToTransform);jQuery.each(jqToTransform.children("li"),function(index,li){var newPara=GENTICS.Aloha.Markup.transformDomObject(li,"p");newPara.after(newPara.children("ol,ul"))});jqToTransform.children().unwrap()}}else{var selectedSiblings=GENTICS.Aloha.Selection.rangeObject.getSelectedSiblings(domToTransform);var jqList=ordered?jQuery("
      "):jQuery("
        ");var jqNewLi=jQuery("
      • ");jqList.append(jqNewLi);jQuery(domToTransform).contents().appendTo(jqNewLi);jQuery(domToTransform).replaceWith(jqList);if(selectedSiblings){var lastLi=false;for(var i=0;i");jqList.append(lastLi)}lastLi.append(selectedSiblings[i])}}}this.mergeAdjacentLists(jqList)}}}}this.refreshSelection()};GENTICS.Aloha.ListPlugin.indentList=function(){var listItem=this.getNearestSelectedListItem();if(listItem){var jqItemBefore=jQuery(listItem).prev("li");if(jqItemBefore.length==0){return false}var jqOldList=jQuery(listItem).parent();var selectedSiblings=GENTICS.Aloha.Selection.rangeObject.getSelectedSiblings(listItem);var jqNewList=jQuery(listItem).parent().clone(false).empty();jqNewList.append(listItem);jqItemBefore.append(jqNewList);if(selectedSiblings){for(var i=0;i0&&GENTICS.Utils.Dom.isListElement(jqParentList.get(0))){var selectedSiblings=GENTICS.Aloha.Selection.rangeObject.getSelectedSiblings(listItem);if(selectedSiblings&&selectedSiblings.length>0){var lastSelected=jQuery(selectedSiblings[selectedSiblings.length-1])}else{var lastSelected=jqListItem}if(lastSelected.nextAll("li").length>0){var jqNewPostList=jqList.clone(false).empty();jqNewPostList.append(lastSelected.nextAll())}if(wrappingLi.length>0){if(typeof jqNewPostList!=="undefined"){jqListItem.append(jqNewPostList)}wrappingLi.after(jqListItem)}else{jqList.before(jqListItem)}if(selectedSiblings&&selectedSiblings.length>0){for(var i=selectedSiblings.length-1;i>=0;--i){jqListItem.after(jQuery(selectedSiblings[i]))}}if(jqList.contents("li").length==0){jqList.remove()}if(wrappingLi.length>0&&wrappingLi.contents().length==0){wrappingLi.remove()}this.refreshSelection()}return false}return true};GENTICS.Aloha.ListPlugin.refreshSelection=function(){if(GENTICS.Aloha.activeEditable){GENTICS.Aloha.activeEditable.obj[0].focus()}GENTICS.Aloha.Selection.rangeObject.update();GENTICS.Aloha.Selection.rangeObject.select();GENTICS.Aloha.Selection.updateSelection()};GENTICS.Aloha.ListPlugin.mergeAdjacentLists=function(jqList){var firstList=jqList.get(0);while(firstList.previousSibling&&firstList.previousSibling.nodeType==1&&firstList.previousSibling.nodeName==firstList.nodeName){firstList=firstList.previousSibling}jqList=jQuery(firstList);while(firstList.nextSibling&&((firstList.nextSibling.nodeType==1&&firstList.nextSibling.nodeName==firstList.nodeName)||(firstList.nextSibling.nodeType==3&&jQuery.trim(firstList.nextSibling.data).length==0))){var jqNextList=jQuery(firstList.nextSibling);if(firstList.nextSibling.nodeType==1){jqNextList.contents().appendTo(jqList)}jqNextList.remove()}}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste deleted file mode 160000 index 56665c88..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 56665c88d4195e303bac477a773e8fd76d5eb292 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/plugin.js new file mode 100644 index 00000000..61a1c78d --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/plugin.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.PastePlugin=new GENTICS.Aloha.Plugin("com.gentics.aloha.plugins.Paste");GENTICS.Aloha.PastePlugin.pasteHandlers=[];GENTICS.Aloha.PastePlugin.init=function(){var that=this;this.pasteDiv=jQuery('
        ');this.pasteDiv.attr("contentEditable","true");jQuery("body").append(this.pasteDiv);GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"editableCreated",function(event,editable){if(jQuery.browser.msie){editable.obj.bind("beforepaste",function(event){that.redirectPaste()})}else{editable.obj.bind("paste",function(event){that.redirectPaste();window.setTimeout(function(){that.getPastedContent()},10)})}});if(jQuery.browser.msie){this.pasteDiv.bind("paste",function(event){window.setTimeout(function(){that.getPastedContent()},10)})}};GENTICS.Aloha.PastePlugin.redirectPaste=function(){this.currentRange=new GENTICS.Utils.RangeObject(true);this.currentEditable=GENTICS.Aloha.activeEditable;this.pasteDiv.text("");if(this.currentEditable){this.currentEditable.blur()}GENTICS.Utils.Dom.setCursorInto(this.pasteDiv.get(0));this.pasteDiv.focus()};GENTICS.Aloha.PastePlugin.getPastedContent=function(){var that=this;for(var i=0;i=0;--i){GENTICS.Utils.Dom.insertIntoDOM(jQuery(pasteDivContents.get(i)),that.currentRange,that.currentEditable.obj,false)}this.currentEditable.activate();this.currentEditable.obj.focus();if(pasteDivContents.length>0){GENTICS.Utils.Dom.setCursorAfter(pasteDivContents.get(pasteDivContents.length-1))}else{this.currentRange.select()}}this.currentRange=false;this.currentEditable=false;this.pasteDiv.text("")};GENTICS.Aloha.PastePlugin.register=function(pasteHandler){this.pasteHandlers.push(pasteHandler)};GENTICS.Aloha.PastePlugin.PasteHandler=function(){GENTICS.Aloha.PastePlugin.register(this)};GENTICS.Aloha.PastePlugin.PasteHandler.prototype.handlePaste=function(jqPasteDiv){}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/wordpastehandler.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/wordpastehandler.js new file mode 100644 index 00000000..7436be39 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Paste/wordpastehandler.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.PastePlugin.WordPasteHandler=new GENTICS.Aloha.PastePlugin.PasteHandler();GENTICS.Aloha.PastePlugin.WordPasteHandler.handlePaste=function(jqPasteDiv){if(this.detectWordContent(jqPasteDiv)){this.transformWordContent(jqPasteDiv)}};GENTICS.Aloha.PastePlugin.WordPasteHandler.detectWordContent=function(jqPasteDiv){var wordDetected=false;jqPasteDiv.find("*").each(function(){var style=jQuery(this).attr("style");if(style){if(style.toLowerCase().indexOf("mso")>=0){wordDetected=true;return false}}var clazz=jQuery(this).attr("class");if(clazz){if(clazz.toLowerCase().indexOf("mso")>=0){wordDetected=true;return false}}});return wordDetected};GENTICS.Aloha.PastePlugin.WordPasteHandler.isOrderedList=function(listSpan){if(listSpan.css("fontFamily")=="Wingdings"||listSpan.css("fontFamily")=="Symbol"){return false}return listSpan.text().match(/^([0-9]{1,3}\.)|([0-9]{1,3}\)|([a-zA-Z]{1,5}\.)|([a-zA-Z]{1,5}\)))$/)?true:false};GENTICS.Aloha.PastePlugin.WordPasteHandler.transformListsFromWord=function(jqPasteDiv){var that=this;var listElementClass="aloha-list-element";var bulletClass="aloha-list-bullet";var detectionFilter="p.MsoListParagraphCxSpFirst,p.MsoListParagraph,p span";var paragraphs=jqPasteDiv.find(detectionFilter);paragraphs.each(function(){var jqElem=jQuery(this);if(jqElem.hasClass("MsoListParagraphCxSpFirst")||jqElem.hasClass("MsoListParagraph")){jqElem.addClass(listElementClass)}else{if(jqElem.css("font-family").indexOf("Symbol")>=0){jqElem.closest("p").addClass(listElementClass)}else{if(jqElem.css("mso-list")!=""){jqElem.closest("p").addClass(listElementClass)}}}});detectionFilter="p span span span";var spans=jqPasteDiv.find(detectionFilter);spans.each(function(){var jqElem=jQuery(this);var innerText=jqElem.text().trim().replace(/ /g,"");if(innerText.length==0){var outerText=jqElem.parent().parent().text().trim().replace(/ /g,"");if(outerText.match(/^([0-9]{1,3}\.)|([0-9]{1,3}\)|([a-zA-Z]{1,5}\.)|([a-zA-Z]{1,5}\)))$/)){jqElem.closest("p").addClass(listElementClass);jqElem.parent().parent().addClass(bulletClass)}}});detectionFilter="p."+listElementClass;var negateDetectionFilter=":not("+detectionFilter+")";paragraphs=jqPasteDiv.find(detectionFilter);if(paragraphs.length>0){paragraphs.each(function(){var jqElem=jQuery(this);jqElem.removeClass(listElementClass);jqElem.find("font").each(function(){jQuery(this).contents().unwrap()});var nestLevel=0;var margin=parseFloat(jqElem.css("marginLeft"));var lists=[];var following=jqElem.nextUntil(negateDetectionFilter);var firstSpan=jQuery(jqElem.find("span."+bulletClass));if(firstSpan.length==0){firstSpan=jQuery(jqElem.children("span:first"))}var ordered=that.isOrderedList(firstSpan);firstSpan.remove();var jqList=jQuery(ordered?"
          ":"
            ");lists.push(jqList);var jqNewLi=jQuery("
          • ");jqList.append(jqNewLi);jqElem.contents().appendTo(jqNewLi);jqElem.replaceWith(jqList);following.each(function(){var jqElem=jQuery(this);jqElem.find("font").each(function(){jQuery(this).contents().unwrap()});var newMargin=parseFloat(jqElem.css("marginLeft"));firstSpan=jQuery(jqElem.find("span."+bulletClass));if(firstSpan.length==0){firstSpan=jQuery(jqElem.children("span:first"))}ordered=that.isOrderedList(firstSpan);firstSpan.remove();if(newMargin>margin){var jqNewList=jQuery(ordered?"
              ":"
                ");jqList.children(":last").append(jqNewList);jqList=jqNewList;lists.push(jqList);nestLevel++;margin=newMargin}else{if(newMargin0){lists.pop();nestLevel--;jqList=lists[nestLevel];margin=newMargin}}jqNewLi=jQuery("
              • ");jqList.append(jqNewLi);jqElem.contents().appendTo(jqNewLi);jqElem.remove()})})}};GENTICS.Aloha.PastePlugin.WordPasteHandler.transformTitles=function(jqPasteDiv){jqPasteDiv.find("p.MsoTitle").each(function(){GENTICS.Aloha.Markup.transformDomObject(jQuery(this),"h1")});jqPasteDiv.find("p.MsoSubtitle").each(function(){GENTICS.Aloha.Markup.transformDomObject(jQuery(this),"h2")})};GENTICS.Aloha.PastePlugin.WordPasteHandler.transformTables=function(jqPasteDiv){jqPasteDiv.find("table").each(function(){jQuery(this).removeAttr("border").removeAttr("cellspacing").removeAttr("cellpadding")});jqPasteDiv.find("td").each(function(){jQuery(this).removeAttr("width").removeAttr("height").removeAttr("valign")})};GENTICS.Aloha.PastePlugin.WordPasteHandler.transformFormattings=function(jqPasteDiv){jqPasteDiv.find("strong,em,s,u").each(function(){if(this.nodeName.toLowerCase()=="strong"){GENTICS.Aloha.Markup.transformDomObject(jQuery(this),"b")}else{if(this.nodeName.toLowerCase()=="em"){GENTICS.Aloha.Markup.transformDomObject(jQuery(this),"i")}else{if(this.nodeName.toLowerCase()=="s"){GENTICS.Aloha.Markup.transformDomObject(jQuery(this),"del")}else{if(this.nodeName.toLowerCase()=="u"){jQuery(this).contents().unwrap()}}}}})};GENTICS.Aloha.PastePlugin.WordPasteHandler.removeComments=function(jqPasteDiv){jqPasteDiv.contents().each(function(){if(this.nodeType==8){jQuery(this).remove()}})};GENTICS.Aloha.PastePlugin.WordPasteHandler.unwrapTags=function(jqPasteDiv){jqPasteDiv.find("span,font,div").each(function(){jQuery(this).contents().unwrap()})};GENTICS.Aloha.PastePlugin.WordPasteHandler.removeStyles=function(jqPasteDiv){jqPasteDiv.find("*").each(function(){jQuery(this).removeAttr("style").removeClass()})};GENTICS.Aloha.PastePlugin.WordPasteHandler.removeNamespacedElements=function(jqPasteDiv){jqPasteDiv.find("*").each(function(){var nsPrefix=this.prefix?this.prefix:(this.scopeName?this.scopeName:undefined);if(nsPrefix&&nsPrefix!="HTML"){jQuery(this).remove()}})};GENTICS.Aloha.PastePlugin.WordPasteHandler.transformWordContent=function(jqPasteDiv){this.transformListsFromWord(jqPasteDiv);this.transformTables(jqPasteDiv);this.transformTitles(jqPasteDiv);this.removeComments(jqPasteDiv);this.unwrapTags(jqPasteDiv);this.removeStyles(jqPasteDiv);this.removeNamespacedElements(jqPasteDiv);this.transformFormattings(jqPasteDiv)}; \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC deleted file mode 160000 index 7d622b36..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7d622b36dc1501f993f39e74649fef64c403ba67 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/de.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/de.dict new file mode 100644 index 00000000..0158dfaf --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/de.dict @@ -0,0 +1 @@ +button.addtoc.tooltip=Inhaltsverzeichnis \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/en.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/en.dict new file mode 100644 index 00000000..bf726d64 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/i18n/en.dict @@ -0,0 +1 @@ +button.addtoc.tooltip=Table of contents \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/plugin.js new file mode 100644 index 00000000..cb4eb1f1 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.TOC/plugin.js @@ -0,0 +1 @@ +(function(){var deps=GENTICS.Aloha.TOC||{jQuery:jQuery},$=deps.jQuery;function last(a){return a[a.length-1]}function head(a){return a[0]}function tail(a){return a.slice(1)}function indexOf(a,item){return detect(a,function(cmp){return cmp===item})}function detect(a,f){for(var i=0;i").attr("id",id).attr("contentEditable","false");var range=GENTICS.Aloha.Selection.getRangeObject();var tocEditable=GENTICS.Aloha.activeEditable;var $tocContainer=$(document.getElementById(tocEditable.getId()));GENTICS.Utils.Dom.insertIntoDOM($tocElement,range,$tocContainer);TOC.create(id).register($containers).update().tickTock()};TOC.spawn=function($ctx,$containers){$ctx=$ctx||$("body");$containers=$containers||TOC.editableContainers();$ctx.find("ol.toc_root").each(function(){var id=$(this).attr("id");if(!id){id=TOC.generateId("toc");$(this).attr("id",id)}TOC.create(id).register($containers).tickTock()})};TOC.create=function(id){allTocs.push(this);return{id:id,"$containers":$(),root:function(){return $(document.getElementById(this.id))},register:function($containers){var self=this;self.$containers=self.$containers.add($containers);self.$containers.filter(function(){return !$(this).data(namespace+"."+self.id+".listening")}).each(function(){var $container=$(this);$container.data(namespace+"."+self.id+".listening",true);$container.bind("blur",function(){self.cleanupIds($container.get(0));self.update($container)})});return self},tickTock:function(interval){var self=this;interval=interval||TOC.settings.updateInterval;if(!interval){return}window.setInterval(function(){self.register(TOC.editableContainers());self.update()},interval);return self},cleanupIds:function(ctx){var ids=[];TOC.headings(this.$containers).each(function(){var id=$(this).attr("id");if((id&&-1!=$.inArray(id,ids))||(ctx&&($.contains(ctx,this)||ctx===this))){$(this).attr("id",TOC.generateId(this))}ids.push(id)});return this},update:function($ctx){var self=this;$ctx=$ctx||self.$containers;var outline=TOC.outline(self.$containers);var ancestors=[self.root()];var prevSiblings=[];last(ancestors).empty();(function descend(outline){var prevSiblings=[];each(outline,function(node){var $section=head(node);var $entry=self.linkSection($section,ancestors,prevSiblings);ancestors.push($entry);descend(tail(node));ancestors.pop();prevSiblings.push($entry)})})(tail(outline));var minEntries=self.root().attr("data-TOC-minEntries")||TOC.settings.minEntries;if(self.root().find("li").length>=minEntries){self.root().show()}else{self.root().hide()}return this},linkSection:function($section,ancestors,prevSiblings){var linkId=$section.eq(0).attr("id");if(!linkId){linkId=TOC.generateId($section.get(0));$section.eq(0).attr("id",linkId)}var $root=this.root();var $entry=TOC.anchorFromLinkId($root,linkId);if(!$entry.length){$entry=$("
              • ")}$entry.find("a").attr("href","#"+linkId).text($section.eq(0).text());if(last(prevSiblings)){last(prevSiblings).after($entry)}else{if(last(ancestors).get(0)==$root.get(0)){$root.append($entry)}else{var $subToc=$("
                  ").append($entry);last(ancestors).append($subToc)}}return $entry}}}}()); \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table deleted file mode 160000 index e7153647..00000000 --- a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e71536475f32b7ee191087f76c2d7acbadad14be diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/de.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/de.dict new file mode 100644 index 00000000..4c6c0b0d --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/de.dict @@ -0,0 +1,14 @@ +floatingmenu.tab.table=Tabelle +deleterows.confirm=Wollen Sie die ausgewählten Zeilen wirklich löschen? +deletecolumns.confirm=Wollen Sie die ausgewählten Spalten wirklich löschen? +deletetable.confirm=Wollen Sie wirklich die ganze Tabelle löschen? +Table=Tabelle +button.createtable.tooltip=Tabelle einfügen +button.addcolleft.tooltip=Spalte links einfügen +button.addcolright.tooltip=Spalte rechts einfügen +button.delcols.tooltip=Spalten löschen +button.addrowbefore.tooltip=Zeile darüber einfügen +button.addrowafter.tooltip=Zeile darunter einfügen +button.delrows.tooltip=Zeilen löschen +button.caption.tooltip=Tabellen Bezeichnung +empty.caption=Tabellen Bezeichnung \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/en.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/en.dict new file mode 100644 index 00000000..5a4bf517 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/en.dict @@ -0,0 +1,14 @@ +floatingmenu.tab.table=Table +deleterows.confirm=Do you really want to delete the selected rows? +deletecolumns.confirm=Do you really want to delete the selected columns? +deletetable.confirm=Do you really want to delete the table? +Table=Table +button.createtable.tooltip=Insert Table +button.addcolleft.tooltip=Add Column left +button.addcolright.tooltip=Add Column right +button.delcols.tooltip=Delete Columns +button.addrowbefore.tooltip=Add Row before +button.addrowafter.tooltip=Add Row after +button.delrows.tooltip=Delete Rows +button.caption.tooltip=Table caption +empty.caption=Table caption \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/eo.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/eo.dict new file mode 100644 index 00000000..c387eb7c --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/eo.dict @@ -0,0 +1,12 @@ +floatingmenu.tab.table=Tabelo +deleterows.confirm=u vi vere volas vii la elektitajn vicojn? +deletecolumns.confirm=u vi vere volas vii la elektitajn kolumnojn? +deletetable.confirm=u vi vere volas forvii la tabelon? +Table=Tabelo +button.createtable.tooltip=Enmeti tabelon +button.addcolleft.tooltip=Aldoni kolumnon maldekstre +button.addcolright.tooltip=Aldoni kolumnon dekstre +button.delcols.tooltip=Forvii kolumnojn +button.addrowbefore.tooltip=Aldoni vicon antae +button.addrowafter.tooltip=Aldoni vicon poste +button.delrows.tooltip=Forvii vicojn \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fi.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fi.dict new file mode 100644 index 00000000..92b60250 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fi.dict @@ -0,0 +1,12 @@ +floatingmenu.tab.table=Taulukko +deleterows.confirm=Oletko varma että haluat poistaa valitut rivit? +deletecolumns.confirm=Oletko varma että haluat poistaa valitut sarakkeet? +deletetable.confirm=Oletko varma että haluat poistaa taulukon? +Table=Taulukko +button.createtable.tooltip=Lisää taulukko +button.addcolleft.tooltip=Lisää sarake vasemmalle +button.addcolright.tooltip=Lisää sarake oikealle +button.delcols.tooltip=Poista sarakkeet +button.addrowbefore.tooltip=Lisää rivi ennen +button.addrowafter.tooltip=Lisää rivi jälkeen +button.delrows.tooltip=Poista rivit diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fr.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fr.dict new file mode 100644 index 00000000..c6386740 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/fr.dict @@ -0,0 +1,12 @@ +floatingmenu.tab.table=Table +deleterows.confirm=Voulez-vous vraiment supprimer les lignes sélectionnées ? +deletecolumns.confirm=Voulez-vous vraiment supprimer les colonnes sélectionnées ? +deletetable.confirm=Voulez-vous vraiment supprimer la table ? +Table=Tableau +button.createtable.tooltip=Insérer un tableau +button.addcolleft.tooltip=Ajouter une colonne à gauche +button.addcolright.tooltip=Ajouter Colonne à droite +button.delcols.tooltip=Colonnes Supprimer +button.addrowbefore.tooltip=Ajouter une ligne avant +button.addrowafter.tooltip=Ajouter une ligne après +button.delrows.tooltip=supprimer des lignes \ No newline at end of file diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/it.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/it.dict new file mode 100644 index 00000000..d357c633 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/it.dict @@ -0,0 +1,12 @@ +floatingmenu.tab.table=Tabella +deleterows.confirm=Vuoi davvero eliminare le righe selezionate? +deletecolumns.confirm=Vuoi davvero eliminare le colonne selezionate? +deletetable.confirm=Vuoi davvero eliminare la tabella? +Table=Tabella +button.createtable.tooltip=Crea una nuova tabella +button.addcolleft.tooltip=Aggiungi una colonna a sinistra +button.addcolright.tooltip=Aggiungi una colonna a destra +button.delcols.tooltip=Elimina colonne +button.addrowbefore.tooltip=Aggiungi una riga prima +button.addrowafter.tooltip=Aggiungi una riga dopo +button.delrows.tooltip=Elimina righe diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/pl.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/pl.dict new file mode 100644 index 00000000..b0741378 --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/pl.dict @@ -0,0 +1,12 @@ +floatingmenu.tab.table=Tabela +deleterows.confirm=Czy na pewno chcesz usunąć zaznaczone wiersze? +deletecolumns.confirm=Czy na pewno chcesz usunąć zaznaczone kolumny? +deletetable.confirm=Czy na pewno chcesz usunąć tabelę? +Table=Tabela +button.createtable.tooltip=Wstaw tabelę +button.addcolleft.tooltip=Dodaj kolumnę na lewo +button.addcolright.tooltip=Dodaj kolumnę na prawo +button.delcols.tooltip=Usuń kolumny +button.addrowbefore.tooltip=Dodaj wiersz przed +button.addrowafter.tooltip=Dodaj wiersz po +button.delrows.tooltip=Usuń wiersze diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/ru.dict b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/ru.dict new file mode 100644 index 00000000..21e82f7a --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/i18n/ru.dict @@ -0,0 +1,12 @@ +floatingmenu.tab.table=Таблица +deleterows.confirm=Вы действительно хотите удалить выбранные строки? +deletecolumns.confirm=Вы действительно хотите удалить выбранные колонки? +deletetable.confirm=Вы действительно хотите удалить таблицу? +Table=Таблица +button.createtable.tooltip=Вставить Таблицу +button.addcolleft.tooltip=Добавить колонку слева +button.addcolright.tooltip=Добавить колонку справа +button.delcols.tooltip=Удалить Колонки +button.addrowbefore.tooltip=Удалить пердыдущую строку +button.addrowafter.tooltip=Удалть следующую строку +button.delrows.tooltip=Удалить Строки diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/plugin.js b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/plugin.js new file mode 100644 index 00000000..4146ff0f --- /dev/null +++ b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/plugin.js @@ -0,0 +1,7 @@ +/* +* Aloha Editor +* Author & Copyright (c) 2010 Gentics Software GmbH +* aloha-sales@gentics.com +* Licensed unter the terms of http://www.aloha-editor.com/license.html +*/ +GENTICS.Aloha.TablePlugin=new GENTICS.Aloha.Plugin("com.gentics.aloha.plugins.Table");GENTICS.Aloha.TablePlugin.createLayer=undefined;GENTICS.Aloha.TablePlugin.languages=["en","de","fr","eo","fi","ru","it","pl"];GENTICS.Aloha.TablePlugin.config=["table"];GENTICS.Aloha.TablePlugin.TableRegistry=new Array();GENTICS.Aloha.TablePlugin.activeTable=undefined;GENTICS.Aloha.TablePlugin.parameters={className:"GENTICS_Aloha_Table",classSelectionRow:"GENTICS_Aloha_Table_selectColumn",classSelectionColumn:"GENTICS_Aloha_Table_selectRow",classLeftUpperCorner:"GENTICS_Aloha_Table_leftUpperCorner",classTableWrapper:"GENTICS_Aloha_Table_wrapper",classCellSelected:"GENTICS_Aloha_Cell_selected",waiRed:"GENTICS_WAI_RED",waiGreen:"GENTICS_WAI_GREEN",selectionArea:10};GENTICS.Aloha.TablePlugin.init=function(){this.createLayer=new GENTICS.Aloha.Table.CreateLayer();var that=this;GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"editableCreated",function(event,editable){editable.obj.bind("mousedown",function(jqEvent){GENTICS.Aloha.TablePlugin.setFocusedTable(undefined)});editable.obj.find("table").each(function(){if(that.isEditableTable(this)){var table=new GENTICS.Aloha.Table(this);table.parentEditable=editable;GENTICS.Aloha.TablePlugin.TableRegistry.push(table)}})});this.initTableButtons();GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"selectionChanged",function(event,rangeObject){if(GENTICS.Aloha.activeEditable){var config=that.getEditableConfig(GENTICS.Aloha.activeEditable.obj);if(jQuery.inArray("table",config)!=-1&&GENTICS.Aloha.Selection.mayInsertTag("table")){that.createTableButton.show()}else{that.createTableButton.hide()}GENTICS.Aloha.TableHelper.unselectCells();var table=rangeObject.findMarkup(function(){return this.nodeName.toLowerCase()=="table"},GENTICS.Aloha.activeEditable.obj);if(table){GENTICS.Aloha.FloatingMenu.setScope(that.getUID(GENTICS.Aloha.TableHelper.selectionType))}else{if(that.activeTable){that.activeTable.focusOut()}}GENTICS.Aloha.FloatingMenu.doLayout()}});GENTICS.Aloha.EventRegistry.subscribe(GENTICS.Aloha,"editableActivated",function(event,props){props.editable.obj.find("table").each(function(){var tr=GENTICS.Aloha.TablePlugin.TableRegistry;for(var i=0;i");that.activeTable.obj.append(c);that.makeCaptionEditable(c,captionText);var cDiv=c.find("div").eq(0);var captionContent=cDiv.contents().eq(0);if(captionContent.length>0){var newRange=new GENTICS.Utils.RangeObject();newRange.startContainer=newRange.endContainer=captionContent.get(0);newRange.startOffset=0;newRange.endOffset=captionContent.text().length;that.activeTable.obj.find("div.GENTICS_Table_Cell_editable").blur();cDiv.focus();newRange.select();GENTICS.Aloha.Selection.updateSelection()}}}}});GENTICS.Aloha.FloatingMenu.addButton(this.getUID("cell"),this.captionButton,GENTICS.Aloha.i18n(this,"floatingmenu.tab.table"),1);this.summary=new GENTICS.Aloha.ui.AttributeField({width:350});this.summary.addListener("keyup",function(obj,event){that.activeTable.checkWai()});GENTICS.Aloha.FloatingMenu.addButton(this.getUID("cell"),this.summary,GENTICS.Aloha.i18n(this,"floatingmenu.tab.table"),1)};GENTICS.Aloha.TablePlugin.makeCaptionEditable=function(caption,captionText){var that=this;var cSpan=caption.children("div").eq(0);if(cSpan.length==0){cSpan=jQuery("
                  ");if(caption.contents().length>0){caption.contents().wrap(cSpan)}else{if(captionText){cSpan.text(captionText)}caption.append(cSpan)}}cSpan.contentEditable(true);cSpan.unbind("mousedown");cSpan.bind("mousedown",function(jqEvent){cSpan.focus();jqEvent.preventDefault();jqEvent.stopPropagation();return false})};GENTICS.Aloha.TablePlugin.createDialog=function(callingElement){this.createLayer.set("target",callingElement);this.createLayer.show()};GENTICS.Aloha.TablePlugin.createTable=function(cols,rows){if(GENTICS.Aloha.activeEditable!=null&&typeof GENTICS.Aloha.activeEditable.obj!="undefined"){var table=document.createElement("table");var tableId=table.id=GENTICS.Aloha.TableHelper.getNewTableID();var tbody=document.createElement("tbody");for(var i=0;i0&&GENTICS.Aloha.TableHelper.selectedCells[0].length>0){GENTICS.Aloha.TableHelper.selectedCells[0][0].firstChild.focus()}}});this.obj.bind("mousedown",function(jqEvent){if(!that.hasFocus){that.focus()}jqEvent.stopPropagation();jqEvent.preventDefault();return false});var tableWrapper=jQuery('
                  ');tableWrapper.contentEditable(false);this.obj.wrap(tableWrapper);var htmlTableWrapper=this.obj.parents("."+this.get("classTableWrapper"));htmlTableWrapper.get(0).onresizestart=function(e){return false};htmlTableWrapper.get(0).oncontrolselect=function(e){return false};this.tableWrapper=this.obj.parents("."+this.get("classTableWrapper")).get(0);jQuery(this.cells).each(function(){this.activate()});this.attachSelectionColumn();this.attachSelectionRow();this.attachLastCellEvents();this.makeCaptionEditable();this.checkWai();this.isActive=true;GENTICS.Aloha.EventRegistry.trigger(new GENTICS.Aloha.Event("tableActivated",GENTICS.Aloha,[this]))};GENTICS.Aloha.Table.prototype.makeCaptionEditable=function(){var caption=this.obj.find("caption").eq(0);if(caption){GENTICS.Aloha.TablePlugin.makeCaptionEditable(caption)}};GENTICS.Aloha.Table.prototype.checkWai=function(){var w=this.wai;w.removeClass(this.get("waiGreen"));w.removeClass(this.get("waiRed"));if(this.obj[0].summary.length>5){w.addClass(this.get("waiGreen"))}else{w.addClass(this.get("waiRed"))}};GENTICS.Aloha.Table.prototype.attachSelectionColumn=function(){var emptyCell=jQuery("");emptyCell.html("\u00a0");var that=this;var rows=this.obj.context.rows;for(var i=0;i=0){this.rowsToSelect.splice(arrayIndex,1)}else{this.rowsToSelect.push(this.clickedRowId)}}else{if(jqEvent.shiftKey){this.rowsToSelect.sort(function(a,b){return a-b});var start=this.rowsToSelect[0];var end=this.clickedRowId;if(start>end){start=end;end=this.rowsToSelect[0]}this.rowsToSelect=new Array();for(var i=start;i<=end;i++){this.rowsToSelect.push(i)}}else{this.rowsToSelect=[this.clickedRowId]}}this.selectRows();jqEvent.preventDefault();jqEvent.stopPropagation();return false};GENTICS.Aloha.Table.prototype.rowSelectionMouseOver=function(jqEvent){var rowIndex=jqEvent.currentTarget.parentNode.rowIndex;if(this.mousedown&&this.clickedRowId>=0){var indexInArray=jQuery.inArray(rowIndex,this.rowsToSelect);var start=(rowIndex");emptyCell.html("\u00a0");var numColumns=this.obj.context.rows[0].cells.length;var selectionRow=jQuery("");selectionRow.addClass(this.get("classSelectionRow"));selectionRow.css("height",this.get("selectionArea")+"px");for(var i=0;i0){this.attachColumnSelectEventsToCell(columnToInsert)}else{var columnToInsert=jQuery("").clone();columnToInsert.addClass(this.get("classLeftUpperCorner"));this.wai=jQuery("
                  ");this.wai.width(25);this.wai.height(12);this.wai.click(function(e){that.focus();GENTICS.Aloha.FloatingMenu.userActivatedTab=GENTICS.Aloha.TablePlugin.i18n("floatingmenu.tab.table");GENTICS.Aloha.FloatingMenu.doLayout();GENTICS.Aloha.TablePlugin.summary.focus();e.stopPropagation();e.preventDefault();return false});columnToInsert.append(this.wai)}selectionRow.append(columnToInsert)}jQuery(document).bind("mouseup",function(e){that.mousedown=false;that.clickedColumnId=-1;that.clickedRowId=-1});this.obj.find("tr:first").before(selectionRow)};GENTICS.Aloha.Table.prototype.attachColumnSelectEventsToCell=function(cell){var that=this;cell.unbind("mousedown");cell.unbind("mouseover");cell.get(0).onselectstart=function(){return false};cell.bind("mousedown",function(e){that.mousedown=true;that.columnSelectionMouseDown(e)});cell.bind("mouseover",function(e){if(that.mousedown){that.columnSelectionMouseOver(e)}})};GENTICS.Aloha.Table.prototype.columnSelectionMouseDown=function(jqEvent){this.focus();if(GENTICS.Aloha.TableHelper.selectedCells.length==0){this.columnsToSelect=new Array()}this.clickedColumnId=jqEvent.currentTarget.cellIndex;if(jqEvent.metaKey){var arrayIndex=jQuery.inArray(this.clickedColumnId,this.columnsToSelect);if(arrayIndex>=0){this.columnsToSelect.splice(arrayIndex,1)}else{this.columnsToSelect.push(this.clickedColumnId)}}else{if(jqEvent.shiftKey){this.columnsToSelect.sort(function(a,b){return a-b});var start=this.columnsToSelect[0];var end=this.clickedColumnId;if(start>end){start=end;end=this.columnsToSelect[0]}this.columnsToSelect=new Array();for(var i=start;i<=end;i++){this.columnsToSelect.push(i)}}else{this.columnsToSelect=[this.clickedColumnId]}}this.selectColumns();jqEvent.preventDefault();jqEvent.stopPropagation();return false};GENTICS.Aloha.Table.prototype.columnSelectionMouseOver=function(jqEvent){var colIndex=jqEvent.currentTarget.cellIndex;if(this.mousedown&&this.clickedColumnId>0){var indexInArray=jQuery.inArray(colIndex,this.columnsToSelect);var start=(colIndex0){for(var i=0;i(this.numRows-rowIDs.length)){focusRowId--}this.releaseLastCellEvents();var rows=this.obj.find("tr");var rows2delete=new Array();for(var i=0;i0){for(var i=0;i(this.numCols-colIDs.length)){focusColID--}this.releaseLastCellEvents();var rows=this.obj.find("tr");var cols2delete=new Array();for(var i=0;i=0){this.deactivate();GENTICS.Aloha.TableHelper.selectionType=undefined;GENTICS.Aloha.TablePlugin.TableRegistry.splice(i,1);var newRange=GENTICS.Aloha.Selection.rangeObject;newRange.startContainer=newRange.endContainer=this.obj.get(0).parentNode;newRange.startOffset=newRange.endOffset=GENTICS.Utils.Dom.getIndexInParent(this.obj.get(0).parentNode);newRange.clearCaches();this.obj.remove();this.parentEditable.obj.focus();newRange.correctRange();newRange.select()}};GENTICS.Aloha.Table.prototype.addRowsBefore=function(highlightNewRows){this.addRows("before",highlightNewRows)};GENTICS.Aloha.Table.prototype.addRowsAfter=function(highlightNewRows){this.addRows("after",highlightNewRows)};GENTICS.Aloha.Table.prototype.addRows=function(position,highlightNewRows){if(typeof GENTICS.Aloha.TablePlugin.activeTable!="undefined"){this.releaseLastCellEvents();var that=this;var numCols=this.numCols;var rowsToInsert=1;var rowId=1;if(GENTICS.Aloha.TableHelper.selectedCells.length>0){rowsToInsert=GENTICS.Aloha.TableHelper.selectedCells.length;switch(position){case"before":if(GENTICS.Aloha.TableHelper.selectedCells[0].length){rowId=GENTICS.Aloha.TableHelper.selectedCells[0][0].parentNode.rowIndex}break;case"after":var lastRow=GENTICS.Aloha.TableHelper.selectedCells.length-1;if(GENTICS.Aloha.TableHelper.selectedCells[lastRow].length){rowId=GENTICS.Aloha.TableHelper.selectedCells[lastRow][0].parentNode.rowIndex}break}}else{if(typeof GENTICS.Aloha.Table.Cell.lastActiveCell!="undefined"){rowId=GENTICS.Aloha.Table.Cell.lastActiveCell.obj.context.parentNode.rowIndex}}var newRowIndex=rowId;if(position=="after"){newRowIndex+=1}var rowIdArray=new Array();for(var j=0;j");var selectionColumn=jQuery("");selectionColumn.addClass(this.get("classSelectionColumn"));this.attachRowSelectionEventsToCell(selectionColumn);insertionRow.append(selectionColumn);for(i=0;i");newCol.html("\u00a0");var cell=new GENTICS.Aloha.Table.Cell(newCol.get(0),GENTICS.Aloha.TablePlugin.activeTable);cell.activate();this.cells.push(cell);insertionRow.append(cell.obj)}var currentRow=jQuery(GENTICS.Aloha.TablePlugin.activeTable.obj.find("tr").get(rowId));switch(position){case"before":currentRow.before(insertionRow);break;case"after":currentRow.after(insertionRow);break;default:this.warn(this,"Wrong call of GENTICS.Aloha.Table.prototype.addRow!")}newRowIndex++;this.numRows++}GENTICS.Aloha.TableHelper.unselectCells();this.rowsToSelect=rowIdArray;if(highlightNewRows){this.selectRows()}this.attachLastCellEvents()}};GENTICS.Aloha.Table.prototype.addColumnsRight=function(){this.addColumns("right")};GENTICS.Aloha.Table.prototype.addColumnsLeft=function(){this.addColumns("left")};GENTICS.Aloha.Table.prototype.addColumns=function(position){if(typeof GENTICS.Aloha.TablePlugin.activeTable!="undefined"){this.releaseLastCellEvents();var that=this;var columnsToInsert=1;var colId=1;if(GENTICS.Aloha.TableHelper.selectedCells.length>0){columnsToInsert=GENTICS.Aloha.TableHelper.selectedCells[0].length;switch(position){case"left":if(GENTICS.Aloha.TableHelper.selectedCells[0].length){colId=GENTICS.Aloha.TableHelper.selectedCells[0][0].cellIndex}break;case"right":var lastColumn=GENTICS.Aloha.TableHelper.selectedCells[0].length-1;if(GENTICS.Aloha.TableHelper.selectedCells[0].length){colId=GENTICS.Aloha.TableHelper.selectedCells[0][lastColumn].cellIndex}break}}else{if(typeof GENTICS.Aloha.Table.Cell.lastActiveCell!="undefined"){colId=GENTICS.Aloha.Table.Cell.lastActiveCell.obj.context.cellIndex}}var newColId=colId;var emptyCell=jQuery("");var rows=this.obj.find("tr");var colIdArray=new Array();for(var i=0;i");var wrapper=this.obj.children("div").eq(0);wrapper.contentEditable(true);wrapper.addClass("GENTICS_Table_Cell_editable");var that=this;wrapper.bind("focus",function(jqEvent){if(jqEvent.currentTarget){jqEvent.currentTarget.indexOf=function(){return -1}}that.editableFocus(jqEvent)});wrapper.bind("mousedown",function(jqEvent){if(jqEvent.currentTarget){jqEvent.currentTarget.indexOf=function(){return -1}}that.editableMouseDown(jqEvent)});wrapper.bind("blur",function(jqEvent){that.editableBlur(jqEvent)});wrapper.bind("keyup",function(jqEvent){that.editableKeyUp(jqEvent)});wrapper.bind("keydown",function(jqEvent){that.editableKeyDown(jqEvent)});wrapper.GENTICS_contentEditableSelectionChange(function(event){GENTICS.Aloha.Selection.onChange(wrapper,event);return wrapper});this.obj.bind("mousedown",function(jqEvent){setTimeout(function(){that.wrapper.trigger("focus")},1);GENTICS.Aloha.TableHelper.unselectCells();jqEvent.stopPropagation()});this.obj.get(0).onselectstart=function(jqEvent){return false};this.wrapper=this.obj.children();this.wrapper.get(0).onselectstart=function(){window.event.cancelBubble=true};return this};GENTICS.Aloha.Table.Cell.prototype.deactivate=function(){var wrapper=this.obj.children(".GENTICS_Table_Cell_editable");if(wrapper.length){var innerHtml=wrapper.html();wrapper.unbind();wrapper.remove();this.obj.unbind("click");if(GENTICS.Aloha.trim(this.obj.attr("class"))==""){this.obj.removeAttr("class")}this.obj.html(innerHtml)}};GENTICS.Aloha.Table.Cell.prototype.toString=function(){return"GENTICS.Aloha.Table.Cell"};GENTICS.Aloha.Table.Cell.prototype.selectAll=function(editableNode){var e=(editableNode.jquery)?editableNode.get(0):editableNode;if(!jQuery.browser.msie){var s=window.getSelection();if(s.setBaseAndExtent){s.setBaseAndExtent(e,0,e,e.innerText.length-1)}else{if(window.opera&&e.innerHTML.substring(e.innerHTML.length-4)=="
                  "){e.innerHTML=e.innerHTML+" "}var r=document.createRange();r.selectNodeContents(e);s.removeAllRanges();s.addRange(r)}}else{if(document.getSelection){var s=document.getSelection();var r=document.createRange();r.selectNodeContents(e);s.removeAllRanges();s.addRange(r)}else{if(document.selection){var r=document.body.createTextRange();r.moveToElementText(e);r.select()}}}GENTICS.Aloha.Selection.updateSelection(editableNode)};GENTICS.Aloha.Table.Cell.prototype.editableMouseDown=function(jqEvent){GENTICS.Aloha.TableHelper.unselectCells();if(this.tableObj.hasFocus){jqEvent.stopPropagation()}};GENTICS.Aloha.Table.Cell.prototype.editableKeyUp=function(jqEvent){this.checkForEmptyEvent(jqEvent)};GENTICS.Aloha.Table.Cell.prototype.editableKeyDown=function(jqEvent){this.checkForEmptyEvent(jqEvent);if(!jqEvent.ctrlKey&&!jqEvent.shiftKey){if(GENTICS.Aloha.TableHelper.selectedCells.length>0&&GENTICS.Aloha.TableHelper.selectedCells[0].length>0){GENTICS.Aloha.TableHelper.selectedCells[0][0].firstChild.focus();GENTICS.Aloha.TableHelper.unselectCells();jqEvent.stopPropagation()}}else{if(jqEvent.shiftKey&&GENTICS.Aloha.TableHelper.selectedCells.length>0){var KEYCODE_ARROWLEFT=37;var KEYCODE_ARROWUP=38;var KEYCODE_ARROWRIGHT=39;var KEYCODE_ARROWDOWN=40;switch(GENTICS.Aloha.TableHelper.selectionType){case"row":switch(jqEvent.keyCode){case KEYCODE_ARROWUP:var firstSelectedRow=GENTICS.Aloha.TableHelper.selectedCells[0][0].parentNode.rowIndex;if(firstSelectedRow>1){this.tableObj.rowsToSelect.push(firstSelectedRow-1)}break;case KEYCODE_ARROWDOWN:var lastRowIndex=GENTICS.Aloha.TableHelper.selectedCells.length-1;var lastSelectedRow=GENTICS.Aloha.TableHelper.selectedCells[lastRowIndex][0].parentNode.rowIndex;if(lastSelectedRow1){this.tableObj.columnsToSelect.push(firstColSelected-1)}break;case KEYCODE_ARROWRIGHT:var lastColIndex=GENTICS.Aloha.TableHelper.selectedCells[0].length-1;var lastColSelected=GENTICS.Aloha.TableHelper.selectedCells[0][lastColIndex].cellIndex;if(lastColSelected0){return}var text=this.wrapper.text();if(text==""){this.wrapper.text("\u00a0");this.wrapper.get(0).blur();this.wrapper.get(0).focus()}};GENTICS.Aloha.Table.CreateLayer=function(){};GENTICS.Aloha.Table.CreateLayer.prototype.parameters={elemId:"GENTICS_Aloha_Table_createLayer",className:"GENTICS_Table_Createdialog",numX:10,numY:10,layer:undefined,target:undefined};GENTICS.Aloha.Table.CreateLayer.prototype.config=new Object();GENTICS.Aloha.Table.CreateLayer.prototype.visible=false;GENTICS.Aloha.Table.CreateLayer.prototype.show=function(){var layer=this.get("layer");if(layer==null){this.create()}else{this.setPosition(layer);layer.find("td").removeClass("hover");layer.show()}this.visible=true};GENTICS.Aloha.Table.CreateLayer.prototype.create=function(){var that=this;var layer=jQuery("
                  ");layer.id=this.get("elemId");layer.addClass(this.get("className"));var table=jQuery("
                  ");table.css("width",(this.get("numX")+6)*15);var tr;var td;for(var i=0;i");for(var j=0;j\u00a0");if(i==0&&j==0){td.addClass("hover")}td.bind("mouseover",{rowId:i,colId:j},function(e){that.handleMouseOver(e,table)});td.bind("click",{rowId:i,colId:j},function(e){var rows=e.data.rowId+1;var cols=e.data.colId+1;GENTICS.Aloha.TablePlugin.createTable(cols,rows);that.hide()});tr.append(td)}table.append(tr)}layer.append(table);this.set("layer",layer);this.setPosition();layer.bind("click",function(e){e.stopPropagation()}).mousedown(function(e){e.stopPropagation()});jQuery("body").append(layer).bind("click",function(e){if(e.target!=that.get("target")&&that.visible){that.hide()}})};GENTICS.Aloha.Table.CreateLayer.prototype.handleMouseOver=function(e,table){var rowId=e.data.rowId;var colId=e.data.colId;var innerRows=table.find("tr");for(var n=0;n<=innerRows.length;n++){var innerCells=jQuery(innerRows[n]).find("td");for(var k=0;k<=innerCells.length;k++){if(n<=rowId&&k<=colId){jQuery(innerCells[k]).addClass("hover")}else{jQuery(innerCells[k]).removeClass("hover")}}}};GENTICS.Aloha.Table.CreateLayer.prototype.setPosition=function(){var targetObj=jQuery(this.get("target"));var pos=targetObj.offset();this.get("layer").css("left",pos.left+"px");this.get("layer").css("top",(pos.top+targetObj.height())+"px")};GENTICS.Aloha.Table.CreateLayer.prototype.hide=function(){this.get("layer").hide();this.visible=false};GENTICS.Aloha.Table.CreateLayer.prototype.get=function(property){if(this.config[property]){return this.config[property]}if(this.parameters[property]){return this.parameters[property]}return undefined};GENTICS.Aloha.Table.CreateLayer.prototype.set=function(key,value){if(this.config[key]){this.config[key]=value}else{this.parameters[key]=value}};GENTICS.Aloha.TableHelper=function(){};GENTICS.Aloha.TableHelper.prototype.selectionType=undefined;GENTICS.Aloha.TableHelper.prototype.selectedCells=new Array();GENTICS.Aloha.TableHelper.prototype.unselectCells=function(){if(this.selectedCells.length>0){for(var i=0;i_E)L!3HEN&baUbDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9F5he4R}c>anMpdfpRr>`sfEfzK|HNCy8=_i0f=AJH&ArhC5 z_Iq+MDDW_=|NTGzcr%CVitu8tNQF)=he^H+rVK}!?awguoi+a5HtW^?WAoi#9AwqF WEXBO2xk?IX1cRrmpUXO@geCxkK{dw! literal 0 HcmV?d00001 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/left.cur b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/left.cur new file mode 100644 index 0000000000000000000000000000000000000000..5df3fd091b7b5b9baa4d68caa88d74b5168954c1 GIT binary patch literal 55 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 Usin2{A1iwRb>17rDGYFaQ7m literal 0 HcmV?d00001 diff --git a/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/wai_red.png b/public/javascripts/admin/aloha/plugins/com.gentics.aloha.plugins.Table/resources/wai_red.png new file mode 100644 index 0000000000000000000000000000000000000000..89589914b94b6269ffd5f65e4310ef91ef3959ec GIT binary patch literal 48696 zcmc$`1#leCm*;6&WXWP?Su9!1+-+IR%*@QJ7TA)-%*@OdGcz+Yvs%n>`u%Ta_iiq3 zcXn;xmgI*( zIsOz^`tp%HzZeC5)Zy&J)Ez&4g1`9ZfcRO)mh|x@j+3yOlc0mKzLUAF%{L`;YvWJM z91P4%3@l8{OsP2=dmlCg|JW$nnmD=YI~acwFtRl;{w8AXVC-t^VCncxP>~I$dM4}B zCkRqI2NhMfw6obRdp{0JbsZ8x)-D~#=hrF?Z8m^P=i3d1#5x9mWPEDc~4`(x|*$@dR8{w=-bql|Ac z(P`rF{b|r!!1CE2SS=<#6<)c>hXrv;Hn>1iM5aHrzZfPJlcS5%AZO<( z@Z7$h${uTn3%cFSNgU1JJ7R-NMXJaPQU)r#YDzO^!JXuNU9MSi^O+25PxC67o<`O_ z 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
                  tcy@i4I;iTsOq&UXl4Yu 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 literal 0 HcmV?d00001 From ee04728d1c26d11b0bdad5ee9a122442dc6e3da2 Mon Sep 17 00:00:00 2001 From: Mario Visic Date: Tue, 17 May 2011 21:40:54 +0800 Subject: [PATCH 02/21] Added content type fields with dates (both string and date types in database.yml). --- spec/fixtures/themes/default.zip | Bin 410691 -> 409953 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/spec/fixtures/themes/default.zip b/spec/fixtures/themes/default.zip index 9bf39d8ffecbd0827d8105fc353b99884dc8c0b8..404afe890f792a42033c35962a9b1b6363a02df1 100644 GIT binary patch delta 4530 zcmZuz2UJwY8lJm%cj!y6OW9Qx*p)6-c9*5tVnZ~jNKqjcVkbtEhzRCMjD~=#jN!xt z5sfV>qAr3Gnh;x}@?tbbOrpdVu||yr-aq%^Ro{D@a}VdvSLQD>``?yNTz@ZgElG4n z$P}I4Rjo^^x5`Oj5&FauA$R0nI@vRSycuFAe0X*geHJaTK#cfr1|hKnLg@B{IrBP# zZF(9q7nl!|REOX8iyzsBCG=)|7l7V^wBt z@|uTDjuR^*$8K5pJSINnmuF}8f|KRC<@Fy ze7kIa=9a>Xq6Yy{JpDwW=FQ zb*SYqx~;PkzJ{FYoVnbPDFyeTK}@swkZ@BA^-ZAyivZnm`4QyP5i z>j~FqSuGr}dy~uC%8xOfb;k})Q6;CuI=0?8zXboP7LArX zxNKXw=hJBN^=B@#4ppkh9jo0C^HZ_Km(25tPjm7b@>6e2{_)a{oXzuw29EPlmd8GN zoYV1a^0T9c=Ay27+9YX{(~f0>L>Cmfj+d54Zy2xI@gRCf=fV*`*KO*ov>eu@KNgW` zvTH$`dgM~(2gQ>Yu8${Ny*a-o-s*{A!uST&rSQOuGVSgD2GQ!kl_~$E-kNEyo3mlY z)93N7{sr$&UjJVHfFGvid5*GN`B(gG*8^eu7g)=T&DjSsIcdY=;fypey?~t^W!te1EBo}?plKV?C&1{EQC(K)yJn+Jr(jx(7-yOajb7gTxaI$5= zsqGEhcWowBHx_l5Po4Soq}4Abe;atcSA44a>hC9->sBUb%7FzCmls_|T zY#Y;%)}HybHt+D04q9xqic7obqS-C2|0k&8@jvY#Ks5P z81lp)5^=A@#o#4b>PUInTY@xA`>m!bCLnbB96}LfY%AkN8htRXIV~AEf%Lb=E{4SP zVu78rB+YRqxHiEPN5*Ec{W-S5CS$#XrMI0d_rs1Pxs`F{fzuM(n%)fOseR}@4$Wfw zy_DG-dNW+fqhdyG*mcL;(9o#oL-c8ivZEn3iz7AT8#k|a3qWXU02yn?c-O3J3J>5z zyVo7ZB}`dWe}*}5p^?S}CfJaBXN4;l5txMGNR9gVbo+;LgiI6&skl7L{IN-m{;sXU z@pYc3;jccM{AMPYY_(g>ym3`Z)RE^MDwXyVb=HF@| zEebBuT2;Jk2(%9xLU$pxb<8S(_iRIyrj~ts!9I-8xA445-?+M-`4J1zP~szbi=7Zn zBdKU%T!?$GL}n~(VdgR1L8$Rg)w+~0&(3dT(3Ni)6i&<8uPhXsk)RN4U8FzC81+X* z*Ee!aB1u{7CP8=O#Ih+tkZdwMda|HL5}cngCH|&=s@A{Gcz&FgL0wv=s5+Z9 zR%eU9(h4P^jJ2`;IcLFPI78<4NTSK^O7Y#kYUdAxYCAjfmsBpOCw4_BsYYkzGkA6$V@;U=;-n+-H}rAx9Zgj!LC zkPMmABPpT>_iZlGqg7Fw3%|q{PJ$4p!=t7Jl97A{Tab0Vl7(Dd)(7Gt+~K8cR58?^ zKR7@1$8r+fE3sc+i&qHoD0QjYX8qjOeG-J?U5ry1{7547mx8`6zUJI@hwUQiIq>GU z+hc-@_$FqU;*S_a?nXg<7CK>f5)_RsiL)90fNxW+8P;;q=Y^+g-4kZaoCQ{O@C1

                  S#TuE|DQ?)aGibiWdc!ubuxP!)+E?|cXzj)4tM@p@6 zy|Cw~&r`MYzZw1WK9HG0WWi*C6ZRlU8f;3+ZSYy4d6bxW{pNREaHP~09~L}1cBgBf zo_=ClFG8pts_iFun2-uB9Pu9=vD8>?hmVNf(8RYdy7sbS1NmH!IO5ep#g-mS*UlK( zyeCwQ&`C2RRBXOjFrXlFe)-&&27Sc}kl|G#R!r{cunYN3hReAEbZE15r*zldoghmG zV*N<$T;>U9rr8}wl57uPDm?IR=(Kelbh^s}w+m@s1*N=aR|U)A}^6 zU9R_ZF|_19JZci+j(v=4`eBb(dP?%Y9B$wOAaDzeB+m!Ckv-lxROQLi56S=c@#zBV z2!Sc8D$pSWpQ6s=CH$x8e|?4$4>cV6F-k0DZjuZoj%O8OWQc2YBS)0jK}qf3n44hf zi{Jy7|I=3$%q1I=v6$rg;81pU-wI4mH>mzaAFN=Fuhy{Pv_wYc z_`&fX=8L^qO*-9NK@B3k55DE0fZZv&5SrzPo41QlaqruUZ zj8S132g7JpuuhHCbuj6q`{bywx2U_3l&EkRxE@sjVNes*dl6GLj%BxZBT`+=_>sLT z$l`r9wgFm^8fZN{q9#A7p-G55po?vHsMen(48V4g45L4_p&JnYgmgG9+4kq zOv{3y!xLXyAd`aeFxL2L#g?23?mL42Gh5$C%Boecl@nbE4igQVM&d%T8us8CC?$JC zpy^+6s{@HyD0iMbL$N~if?G?0j5ok5Tb{*ou|tHmq%)h9lGy{fwDCYd$7~X>55fJ2 zR|uS=w1K!E$Y8Q6*y2j@E1B+**o45CwIf};_6emNfA}WFm1Kl*&M;>c?6XwKE9Xzr z;7;_Re^Yd9n&g#zd^ncFzFFY_JbC__>`*w|z;!Qp>M{n#n0Ex1XmkWnyIuzhBCwV% z>yePA2pk7yY$P!5_E56`GCmS}a7XFQ@rscD8&$9G<#*a0iB({69xO!d60#r~%eYBR zV8~jLh$tM!mSIe$n!@kQDtHrJ!emoCyj+apqJz<^5GhUgHJHA7(QhWyB^pe3MgtaN zN?(<9)JjQAG`8W6zr!Ga9-Hzq7_w4w5{4)Ty+RZw;1$JA5a;_kZjV(ID0bl$Fd1zq zU_)o4wpxRx~%E?_`v5W$% zJg8zg@NUu9ZJq+plEfz9{s3ep0FdWJc}fB!(~Rs-;I?e1zy&$4uujBk^Q~S8ZBf7n GKKc*v3VQtj delta 5408 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 I;=fbsf31SNBLDyZ From c7109af0b8a3fcf3706cd047d1dfeafe2cbc6228 Mon Sep 17 00:00:00 2001 From: Mario Visic Date: Tue, 17 May 2011 21:42:47 +0800 Subject: [PATCH 03/21] Importer now supports date content type fields as strings or date objects. --- lib/locomotive/import/content_types.rb | 2 +- spec/lib/locomotive/import_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/locomotive/import/content_types.rb b/lib/locomotive/import/content_types.rb index f610ec16..0665671e 100644 --- a/lib/locomotive/import/content_types.rb +++ b/lib/locomotive/import/content_types.rb @@ -79,7 +79,7 @@ module Locomotive value = (case field.kind.downcase when 'file' then self.open_sample_asset(value) when 'boolean' then Boolean.set(value) - when 'date' then Date.parse(value) + when 'date' then value.is_a?(Date) ? value : Date.parse(value) when 'category' if field.category_items.detect { |item| item.name == value }.nil? field.category_items.build :name => value diff --git a/spec/lib/locomotive/import_spec.rb b/spec/lib/locomotive/import_spec.rb index 485fc379..5935e0dd 100644 --- a/spec/lib/locomotive/import_spec.rb +++ b/spec/lib/locomotive/import_spec.rb @@ -22,7 +22,7 @@ describe Locomotive::Import::Job do it 'adds content types' do @site.content_types.count.should == 2 content_type = @site.content_types.where(:slug => 'projects').first - content_type.content_custom_fields.size.should == 6 + content_type.content_custom_fields.size.should == 7 end it 'converts correctly the order_by option for content types' do From 8ad6ee580e74ec34a407c6b2ee06144dc44cf343 Mon Sep 17 00:00:00 2001 From: did Date: Tue, 24 May 2011 12:23:05 -0700 Subject: [PATCH 04/21] fix issue #78 --- Gemfile | 4 +++- Gemfile.lock | 20 +++++++++---------- app/models/content_instance.rb | 1 - app/models/content_type.rb | 6 +++++- .../admin/shared/menu/_contents.html.haml | 2 +- features/admin/contents.feature | 10 ++++++++++ lib/locomotive/custom_fields.rb | 6 +++++- locomotive_cms.gemspec | 2 +- spec/models/content_type_spec.rb | 19 +++++++++++++----- 9 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 features/admin/contents.feature diff --git a/Gemfile b/Gemfile index c59f2cd1..da254639 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,8 @@ source :rubygems # add in all the runtime dependencies +gem 'rake', '0.8.7' + gem 'rails', '>= 3.0.7' gem 'warden' @@ -20,7 +22,7 @@ gem 'inherited_resources', '~> 1.1.2' gem 'rmagick', '2.12.2' gem 'locomotive_carrierwave', '0.5.0.1.beta3', :require => 'carrierwave' -gem 'custom_fields', '1.0.0.beta.12' +gem 'custom_fields', '1.0.0.beta.13' gem 'fog', '0.3.7' gem 'mimetype-fu' gem 'actionmailer-with-request', :require => 'actionmailer_with_request' diff --git a/Gemfile.lock b/Gemfile.lock index 9f6b95ba..2de2373d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,6 @@ GIT remote: git://github.com/floehopper/mocha.git - revision: 7dd9512a874f89b8037d7320fe7988c222f439e1 + revision: adeb8ae0189963cf3024f2b37d5348a7feaae11e specs: mocha (0.9.12.20110213002255) @@ -87,7 +87,7 @@ GEM cucumber-rails (0.3.2) cucumber (>= 0.8.0) culerity (0.2.15) - custom_fields (1.0.0.beta.12) + custom_fields (1.0.0.beta.13) activesupport (>= 3.0.7) locomotive_carrierwave mongoid (~> 2.0.1) @@ -110,7 +110,7 @@ GEM factory_girl_rails (1.0.1) factory_girl (~> 1.3) railties (>= 3.0.0) - ffi (1.0.8) + ffi (1.0.9) fog (0.3.7) builder excon (>= 0.2.3) @@ -120,7 +120,7 @@ GEM net-ssh (~> 2.0.23) nokogiri (~> 1.4.3.1) ruby-hmac - formatador (0.1.3) + formatador (0.1.4) formtastic (1.2.3) actionpack (>= 2.3.7) activesupport (>= 2.3.7) @@ -146,7 +146,7 @@ GEM yui-compressor (>= 0.9.1) json (1.5.1) json_pure (1.4.6) - kgio (2.4.0) + kgio (2.4.1) launchy (0.3.7) configuration (>= 0.0.5) rake (>= 0.8.1) @@ -172,11 +172,10 @@ GEM mimetype-fu (0.1.2) mongo (1.3.1) bson (>= 1.3.1) - mongoid (2.0.1) + mongoid (2.0.2) activemodel (~> 3.0) mongo (~> 1.3) tzinfo (~> 0.3.22) - will_paginate (~> 3.0.pre) net-ssh (2.0.24) nokogiri (1.4.3.1) open4 (1.0.1) @@ -185,7 +184,7 @@ GEM rake polyglot (0.3.1) proxies (0.2.1) - rack (1.2.2) + rack (1.2.3) rack-mount (0.6.14) rack (>= 1.0.0) rack-test (0.5.7) @@ -257,7 +256,7 @@ GEM rack warden (0.10.7) rack (>= 1.0.0) - will_paginate (3.0.pre2) + will_paginate (2.3.15) yui-compressor (0.9.6) POpen4 (>= 0.1.4) @@ -275,7 +274,7 @@ DEPENDENCIES capybara cucumber (= 0.8.5) cucumber-rails - custom_fields (= 1.0.0.beta.12) + custom_fields (= 1.0.0.beta.13) database_cleaner delayed_job (= 2.1.4) delayed_job_mongoid (= 1.0.2) @@ -298,6 +297,7 @@ DEPENDENCIES mongoid (~> 2.0.1) pickle rails (>= 3.0.7) + rake (= 0.8.7) rmagick (= 2.12.2) rspec-rails (= 2.3.1) ruby-debug diff --git a/app/models/content_instance.rb b/app/models/content_instance.rb index 70a55112..96174dd0 100644 --- a/app/models/content_instance.rb +++ b/app/models/content_instance.rb @@ -25,7 +25,6 @@ class ContentInstance after_create :send_notifications ## named scopes ## - scope :persisted, where(:updated_at.ne => nil) scope :latest_updated, :order_by => :updated_at.desc, :limit => Locomotive.config.lastest_items_nb ## methods ## diff --git a/app/models/content_type.rb b/app/models/content_type.rb index 00343fd2..77ba8c2a 100644 --- a/app/models/content_type.rb +++ b/app/models/content_type.rb @@ -18,7 +18,7 @@ class ContentType embeds_many :contents, :class_name => 'ContentInstance', :validate => false do def visible @target.find_all { |c| c.visible? } - end + end end ## named scopes ## @@ -69,6 +69,10 @@ class ContentType self.ordered_contents end end + + def latest_updated_contents + self.contents.latest_updated.reject { |c| !c.persisted? } + end def ordered_contents(conditions = {}) column = self.order_by.to_sym diff --git a/app/views/admin/shared/menu/_contents.html.haml b/app/views/admin/shared/menu/_contents.html.haml index 94179ed0..1c078e9a 100644 --- a/app/views/admin/shared/menu/_contents.html.haml +++ b/app/views/admin/shared/menu/_contents.html.haml @@ -15,7 +15,7 @@ .inner %h2!= t('admin.contents.index.lastest_items') %ul - - content_type.contents.persisted.latest_updated.each do |content| + - content_type.latest_updated_contents.each do |content| %li = link_to truncate(content.send(content_type.highlighted_field_name).to_s, :length => 20), edit_admin_content_path(content_type.slug, content) %span= time_ago_in_words(content.updated_at) diff --git a/features/admin/contents.feature b/features/admin/contents.feature new file mode 100644 index 00000000..be2d2268 --- /dev/null +++ b/features/admin/contents.feature @@ -0,0 +1,10 @@ +Feature: Manage Contents + In order to manage instances from custom content types + As an administrator + I want to add/edit/delete custom contents of my site + +Background: + Given I have the site: "test site" set up + And I am an authenticated user + + diff --git a/lib/locomotive/custom_fields.rb b/lib/locomotive/custom_fields.rb index 2283f3c8..5091e5fc 100644 --- a/lib/locomotive/custom_fields.rb +++ b/lib/locomotive/custom_fields.rb @@ -1,3 +1,8 @@ +# Custom options for CustomFields +CustomFields.options = { + :reserved_aliases => Mongoid.destructive_fields + %w(created_at updated_at) +} + # Set correct paths module CustomFields module Types @@ -17,4 +22,3 @@ module CustomFields end end - diff --git a/locomotive_cms.gemspec b/locomotive_cms.gemspec index 56061bf6..9d990ceb 100644 --- a/locomotive_cms.gemspec +++ b/locomotive_cms.gemspec @@ -37,7 +37,7 @@ Gem::Specification.new do |s| s.add_dependency "rmagick", "2.12.2" s.add_dependency "locomotive_carrierwave", "0.5.0.1.beta3" - s.add_dependency "custom_fields", "1.0.0.beta.12" + s.add_dependency "custom_fields", "1.0.0.beta.13" s.add_dependency "fog", "0.3.7" s.add_dependency "mimetype-fu" s.add_dependency "actionmailer-with-request" diff --git a/spec/models/content_type_spec.rb b/spec/models/content_type_spec.rb index 496a4e32..59b362b3 100644 --- a/spec/models/content_type_spec.rb +++ b/spec/models/content_type_spec.rb @@ -17,20 +17,20 @@ describe ContentType do # Validations ## %w{site name}.each do |field| - it "should validate presence of #{field}" do + it "requires the presence of #{field}" do content_type = Factory.build(:content_type, field.to_sym => nil) content_type.should_not be_valid content_type.errors[field.to_sym].should == ["can't be blank"] end end - it 'should validate presence of slug' do + it 'requires the presence of slug' do content_type = Factory.build(:content_type, :name => nil, :slug => nil) content_type.should_not be_valid content_type.errors[:slug].should == ["can't be blank"] end - it 'should validate uniqueness of slug' do + it 'is not valid if slug is not unique' do content_type = Factory.build(:content_type) content_type.content_custom_fields.build :label => 'anything', :kind => 'String' content_type.save @@ -38,12 +38,21 @@ describe ContentType do content_type.errors[:slug].should == ["is already taken"] end - it 'should validate size of content custom fields' do + it 'is not valid if there is not at least one field' do content_type = Factory.build(:content_type) content_type.should_not be_valid content_type.errors[:content_custom_fields].should == ["is too small (minimum element number is 1)"] end - + + %w(created_at updated_at).each do |_alias| + it "does not allow #{_alias} as alias" do + content_type = Factory.build(:content_type) + field = content_type.content_custom_fields.build :label => 'anything', :kind => 'String', :_alias => _alias + field.valid?.should be_false + field.errors[:_alias].should == ['is reserved'] + end + end + end context '#ordered_contents' do From 2ce1fadf52db285455acaa9ec1ec1b069391878a Mon Sep 17 00:00:00 2001 From: did Date: Fri, 27 May 2011 08:19:20 -0700 Subject: [PATCH 05/21] simplify the installation procedure for bushido users --- .gitignore | 1 + Gemfile | 10 ++++-- Gemfile.lock | 15 ++++++--- config/environments/development.rb | 10 ++++++ config/locales/formtastic.it.yml | 2 +- doc/TODO | 22 +++++++------- lib/locomotive/hosting/bushido.rb | 2 +- lib/locomotive/import.rb | 8 ++++- lib/locomotive/import/job.rb | 1 + lib/locomotive/middlewares/fonts.rb | 6 +++- lib/tasks/bushido.rake | 47 +++++++++++++++++++++++++++-- lib/tasks/locomotive.rake | 12 ++++++++ 12 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 lib/tasks/locomotive.rake diff --git a/.gitignore b/.gitignore index bf447d5f..977de89e 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ config/deploy.rb perf/*.rb gem_graph.png sites/ +permanent diff --git a/Gemfile b/Gemfile index da254639..5a494b87 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,6 @@ gem 'fog', '0.3.7' gem 'mimetype-fu' gem 'actionmailer-with-request', :require => 'actionmailer_with_request' gem 'heroku', '1.19.1' -gem 'bushido' gem 'httparty', '>= 0.6.1' gem 'RedCloth', '4.2.7' gem 'delayed_job', '2.1.4' @@ -41,11 +40,16 @@ gem 'SystemTimer', :platforms => :ruby_18 group :development do # Using unicorn_rails instead of webrick (default server) gem 'unicorn' + gem 'bushido_stub', :path => '../gems/bushido_stub' end group :test, :development do - gem "ruby-debug", :platforms => :mri_18 - gem "ruby-debug19", :platforms => :mri_19 + gem 'ruby-debug', :platforms => :mri_18 + gem 'ruby-debug19', :platforms => :mri_19 +end + +group :production do + gem 'bushido' end group :test do diff --git a/Gemfile.lock b/Gemfile.lock index 2de2373d..38270433 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,6 +11,12 @@ GIT xpath (0.1.2) nokogiri (~> 1.4) +PATH + remote: ../gems/bushido_stub + specs: + bushido_stub (0.0.1) + activesupport + GEM remote: http://rubygems.org/ specs: @@ -74,7 +80,6 @@ GEM celerity (0.8.9) childprocess (0.1.9) ffi (~> 1.0.6) - closure-compiler (1.1.1) columnize (0.3.2) configuration (1.2.0) crack (0.1.8) @@ -141,9 +146,8 @@ GEM inherited_resources (1.1.2) has_scope (~> 0.5.0) responders (~> 0.6.0) - jammit (0.6.0) - closure-compiler (>= 0.1.0) - yui-compressor (>= 0.9.1) + jammit (0.6.3) + yui-compressor (>= 0.9.3) json (1.5.1) json_pure (1.4.6) kgio (2.4.1) @@ -244,7 +248,7 @@ GEM ffi (>= 1.0.7) json_pure rubyzip - spork (0.8.4) + spork (0.8.5) term-ansicolor (1.0.5) thor (0.14.6) treetop (1.4.9) @@ -271,6 +275,7 @@ DEPENDENCIES autotest bson_ext (~> 1.3.0) bushido + bushido_stub! capybara cucumber (= 0.8.5) cucumber-rails diff --git a/config/environments/development.rb b/config/environments/development.rb index b973ee5f..c66e1a8b 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -27,4 +27,14 @@ Locomotive::Application.configure do :port => 1025, :domain => "example.com" } + + # set up the bushido stub (uncomment it) + # config.bushido_stub_env = false + + config.bushido_stub_env = { + 'APP_TLD' => 'bushi.do', + 'BUSHIDO_APP' => 'san_francisco', + 'BUSHIDO_HOST' => 'bushi.do', + 'LOCOMOTIVE_SITE_NAME' => 'Locomotive TEST' + } end \ No newline at end of file diff --git a/config/locales/formtastic.it.yml b/config/locales/formtastic.it.yml index 66e20276..adb1a689 100644 --- a/config/locales/formtastic.it.yml +++ b/config/locales/formtastic.it.yml @@ -14,7 +14,7 @@ it: membership_email: Email account file: File preview: Anteprima - options: Opzioni + options: Opzioni avanzate custom_fields: Campi personalizzati other_fields: Altre informazioni presentation: Presentazione diff --git a/doc/TODO b/doc/TODO index 6487944f..7eb36344 100644 --- a/doc/TODO +++ b/doc/TODO @@ -1,28 +1,25 @@ BOARD: -x bugs: - x #50 - x #51 ~ editable_elements: inheritable: false (Mattias) => seems to be fixed by Dirk's last pull request (#44) => content tag - bushido version -- upgrade warning if new version of locomotive (maybe based on the commit id) -- duostack version -x 2 different sites on the same main domain (one in www, the other one in something else) (Raphael Costa) -- seo section for the page form: seo title, seo keywords, seo description -- icon for redirection page in the pages section (back-office) -- write my first tutorial about locomotive + - default template BACKLOG: - custom_fields: - validation: regexp (pre-defined regexps ?) - - new type: belongs_to => association + x new type: belongs_to => association - inline editing (http://www.aloha-editor.com/wiki/index.php/Aloha_PHP_Example) - html view in the aloha popup - editable elements should wrap a tag: div, h1, ...etc (default span) - edit images (upload new ones, ...etc) => wait for aloha or send them an email ? - global regions: keyword in editable element (http://www.mongodb.org/display/DOCS/Updating) - cucumber features for admin pages (in progress) +(- duostack version) +- icon for redirection page in the pages section (back-office) +- write my first tutorial about locomotive +- upgrade warning if new version of locomotive (maybe based on the commit id) + REFACTORING: @@ -211,4 +208,7 @@ x validation for custom fields: required done x pull request #44 x bug on dates (https://github.com/locomotivecms/engine/issues#issue/48) x generated sitemaps are invalid (url + date) -x integrate new locomotivecms home \ No newline at end of file +x integrate new locomotivecms home +x seo section for the page form: seo title, seo keywords, seo description +x bugs: #50, #51 +x 2 different sites on the same main domain (one in www, the other one in something else) (Raphael Costa) \ No newline at end of file diff --git a/lib/locomotive/hosting/bushido.rb b/lib/locomotive/hosting/bushido.rb index 8a30623d..6e437b2f 100644 --- a/lib/locomotive/hosting/bushido.rb +++ b/lib/locomotive/hosting/bushido.rb @@ -29,7 +29,7 @@ module Locomotive self.setup_smtp_settings - self.config.delayed_job = true # force the use of delayed_job + self.config.delayed_job = false #true # force the use of delayed_job self.bushido_domains = ::Bushido::App.domains self.bushido_subdomain = ::Bushido::App.subdomain diff --git a/lib/locomotive/import.rb b/lib/locomotive/import.rb index 45ebd993..a78381ce 100644 --- a/lib/locomotive/import.rb +++ b/lib/locomotive/import.rb @@ -6,4 +6,10 @@ require 'locomotive/import/assets' require 'locomotive/import/asset_collections' require 'locomotive/import/content_types' require 'locomotive/import/snippets' -require 'locomotive/import/pages' \ No newline at end of file +require 'locomotive/import/pages' + +module Locomotive + module Import + DEFAULT_SITE_TEMPLATE = 'https://github.com/locomotivecms/default-site-template/zipball/master' + end +end \ No newline at end of file diff --git a/lib/locomotive/import/job.rb b/lib/locomotive/import/job.rb index f45d3e13..2a65c0b8 100644 --- a/lib/locomotive/import/job.rb +++ b/lib/locomotive/import/job.rb @@ -70,6 +70,7 @@ module Locomotive job = self.new(zipfile, site, options) if Locomotive.config.delayed_job + puts "delayed::JOB !" Delayed::Job.enqueue job, { :site => site, :job_type => 'import' } else job.perform diff --git a/lib/locomotive/middlewares/fonts.rb b/lib/locomotive/middlewares/fonts.rb index 49c66d4d..05c22e62 100644 --- a/lib/locomotive/middlewares/fonts.rb +++ b/lib/locomotive/middlewares/fonts.rb @@ -10,7 +10,11 @@ module Locomotive def call(env) if env["PATH_INFO"] =~ @path_regexp - site = fetch_site(env['SERVER_NAME']) + if Locomotive.config.multi_sites? + site = fetch_site(env['SERVER_NAME']) + else + site = Site.first + end if site.nil? @app.call(env) diff --git a/lib/tasks/bushido.rake b/lib/tasks/bushido.rake index 159d3c10..07f99450 100644 --- a/lib/tasks/bushido.rake +++ b/lib/tasks/bushido.rake @@ -1,10 +1,53 @@ require 'bushido' require 'jammit' +require 'net/http' namespace :bushido do desc "Prepare an app to run on the Bushido hosting platform, only called during the initial installation. Called just before booting the app." - task :install do + task :install => :environment do Jammit.package! + + if ENV['BUSHIDO_USER_EMAIL'] && ENV['BUSHIDO_USER_ID'] + # already logged in in Bushido + account = Account.create!({ + :email => ENV['BUSHIDO_USER_EMAIL'], + :name => ENV['BUSHIDO_USER_NAME'] || ENV['BUSHIDO_USER_EMAIL'].split('@').first, + :password => ActiveSupport::SecureRandom.base64(6) + }) + else + # create an anonymous account right away + account = Account.create!({ + :email => "#{ENV['BUSHIDO_APP']}@#{ENV['BUSHIDO_HOST']}", + :name => ENV['BUSHIDO_APP'], + :password => ActiveSupport::SecureRandom.base64(6) + }) + end + + # create the site + site = Site.create_first_one(:name => ENV['LOCOMOTIVE_SITE_NAME'] || ENV['BUSHIDO_APP']) + + # fetch the site template + template_url = ENV['SITE_TEMPLATE_URL'] || Locomotive::Import::DEFAULT_SITE_TEMPLATE + template_url = "http://#{template_url}" unless template_url =~ /^https?:\/\// + + template_local_path = "#{Rails.root}/permanent/site_template.zip" + + uri = URI.parse(template_url) + http = Net::HTTP.new(uri.host, uri.port) + + if template_url.starts_with?('https') # ssl request ? + http.use_ssl = true + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + end + + case http.request(Net::HTTP::Get.new(uri.request_uri)) + when Net::HTTPSuccess, Net::HTTPFound + `curl -L -s -o #{template_local_path} #{template_url}` + + Locomotive::Import::Job.run!(File.open(template_local_path), site, { :samples => true }) + else + # do nothing + end end desc "Prepare an app to run on the Bushido hosting platform, called on every update. Called just before booting the app." @@ -12,4 +55,4 @@ namespace :bushido do Jammit.package! end end - + diff --git a/lib/tasks/locomotive.rake b/lib/tasks/locomotive.rake new file mode 100644 index 00000000..227de113 --- /dev/null +++ b/lib/tasks/locomotive.rake @@ -0,0 +1,12 @@ +namespace :locomotive do + + desc 'Fetch the Locomotive default site template for the installation' + task :fetch_default_site_template => :environment do + puts "Downloading default site template from '#{Locomotive::Import.DEFAULT_SITE_TEMPLATE}'" + `curl -L -s -o #{Rails.root}/tmp/default_site_template.zip #{Locomotive::Import.DEFAULT_SITE_TEMPLATE}` + puts '...done' + end + +end + + From 47ffafca2020225d4f99a729d45551c93fe0cf0c Mon Sep 17 00:00:00 2001 From: did Date: Fri, 27 May 2011 08:25:40 -0700 Subject: [PATCH 06/21] font files were not correctly served with Locomotive running in single-site --- lib/locomotive/middlewares/fonts.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/locomotive/middlewares/fonts.rb b/lib/locomotive/middlewares/fonts.rb index 49c66d4d..05c22e62 100644 --- a/lib/locomotive/middlewares/fonts.rb +++ b/lib/locomotive/middlewares/fonts.rb @@ -10,7 +10,11 @@ module Locomotive def call(env) if env["PATH_INFO"] =~ @path_regexp - site = fetch_site(env['SERVER_NAME']) + if Locomotive.config.multi_sites? + site = fetch_site(env['SERVER_NAME']) + else + site = Site.first + end if site.nil? @app.call(env) From ef7ac0e721f0096cc3ffbc6a8b1c79396d650bb7 Mon Sep 17 00:00:00 2001 From: did Date: Fri, 27 May 2011 15:14:45 -0700 Subject: [PATCH 07/21] make the bushido installation process the smoothest --- .gitignore | 1 + Gemfile | 2 +- Gemfile.lock | 5 +- lib/locomotive/hosting/bushido.rb | 13 ++++- lib/locomotive/hosting/bushido/account_ext.rb | 19 +++++++ lib/locomotive/hosting/bushido/middleware.rb | 51 +++++++++++++++++++ lib/tasks/bushido.rake | 35 +++++++++++-- 7 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 lib/locomotive/hosting/bushido/account_ext.rb create mode 100644 lib/locomotive/hosting/bushido/middleware.rb diff --git a/.gitignore b/.gitignore index 977de89e..7852ac7c 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ perf/*.rb gem_graph.png sites/ permanent +doc/bushido diff --git a/Gemfile b/Gemfile index 5a494b87..b8615c5d 100644 --- a/Gemfile +++ b/Gemfile @@ -40,12 +40,12 @@ gem 'SystemTimer', :platforms => :ruby_18 group :development do # Using unicorn_rails instead of webrick (default server) gem 'unicorn' - gem 'bushido_stub', :path => '../gems/bushido_stub' end group :test, :development do gem 'ruby-debug', :platforms => :mri_18 gem 'ruby-debug19', :platforms => :mri_19 + gem 'bushido_stub', :path => '../gems/bushido_stub' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 38270433..9d25c6b9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,6 @@ GIT remote: git://github.com/floehopper/mocha.git - revision: adeb8ae0189963cf3024f2b37d5348a7feaae11e + revision: 6da1242f26b12a24c4fcf67bf5921a25bc1bc88d specs: mocha (0.9.12.20110213002255) @@ -15,7 +15,6 @@ PATH remote: ../gems/bushido_stub specs: bushido_stub (0.0.1) - activesupport GEM remote: http://rubygems.org/ @@ -64,7 +63,7 @@ GEM bson (1.3.1) bson_ext (1.3.1) builder (2.1.2) - bushido (0.0.12) + bushido (0.0.14) highline (>= 1.6.1) json (>= 1.4.6) rest-client (>= 1.6.1) diff --git a/lib/locomotive/hosting/bushido.rb b/lib/locomotive/hosting/bushido.rb index 6e437b2f..3977424c 100644 --- a/lib/locomotive/hosting/bushido.rb +++ b/lib/locomotive/hosting/bushido.rb @@ -1,6 +1,8 @@ require 'bushido' require 'locomotive/hosting/bushido/custom_domain' require 'locomotive/hosting/bushido/first_installation' +require 'locomotive/hosting/bushido/account_ext' +require 'locomotive/hosting/bushido/middleware' module Locomotive module Hosting @@ -29,7 +31,9 @@ module Locomotive self.setup_smtp_settings - self.config.delayed_job = false #true # force the use of delayed_job + self.add_middleware + + self.config.delayed_job = true # force the use of delayed_job self.bushido_domains = ::Bushido::App.domains self.bushido_subdomain = ::Bushido::App.subdomain @@ -38,6 +42,7 @@ module Locomotive def enhance_site_model_with_bushido Site.send :include, Locomotive::Hosting::Bushido::CustomDomain Site.send :include, Locomotive::Hosting::Bushido::FirstInstallation + Account.send :include, Locomotive::Hosting::Bushido::AccountExt end def setup_smtp_settings @@ -53,6 +58,12 @@ module Locomotive } end + def add_middleware + ::Locomotive::Application.configure do |config| + config.middleware.use '::Locomotive::Hosting::Bushido::Middleware' + end + end + # manage domains def add_bushido_domain(name) diff --git a/lib/locomotive/hosting/bushido/account_ext.rb b/lib/locomotive/hosting/bushido/account_ext.rb new file mode 100644 index 00000000..8b257959 --- /dev/null +++ b/lib/locomotive/hosting/bushido/account_ext.rb @@ -0,0 +1,19 @@ +module Locomotive + module Hosting + module Bushido + + module AccountExt + + extend ActiveSupport::Concern + + included do + + field :bushido_user_id, :type => Integer + + end + + end + + end + end +end \ No newline at end of file diff --git a/lib/locomotive/hosting/bushido/middleware.rb b/lib/locomotive/hosting/bushido/middleware.rb new file mode 100644 index 00000000..d22e5b5b --- /dev/null +++ b/lib/locomotive/hosting/bushido/middleware.rb @@ -0,0 +1,51 @@ +require 'rack/utils' + +module Locomotive + module Hosting + module Bushido + class Middleware + + BUSHIDO_JS_URL = 'http://localhost:4567/javascripts/bushido.js' + + include Rack::Utils + + def initialize(app, opts = {}) + @app = app + @bushido_app_name = ENV['BUSHIDO_APP'] + @bushido_claimed = ENV['BUSHIDO_CLAIMED'] && ENV['BUSHIDO_CLAIMED'].to_s.downcase == 'true' + end + + def call(env) + status, headers, response = @app.call(env) + + if env["PATH_INFO"] =~ /^\/admin\// + content = "" + response.each { |part| content += part } + + # "claiming" bar + stats ? + content.gsub!(/<\/body>/i, <<-STR + + + STR + ) + + headers['content-length'] = bytesize(content).to_s + + [status, headers, [content]] + else + [status, headers, response] + end + end + + end + end + end +end diff --git a/lib/tasks/bushido.rake b/lib/tasks/bushido.rake index 07f99450..a2bdcfd2 100644 --- a/lib/tasks/bushido.rake +++ b/lib/tasks/bushido.rake @@ -5,14 +5,17 @@ require 'net/http' namespace :bushido do desc "Prepare an app to run on the Bushido hosting platform, only called during the initial installation. Called just before booting the app." task :install => :environment do + + # re-built assets Jammit.package! if ENV['BUSHIDO_USER_EMAIL'] && ENV['BUSHIDO_USER_ID'] # already logged in in Bushido account = Account.create!({ - :email => ENV['BUSHIDO_USER_EMAIL'], - :name => ENV['BUSHIDO_USER_NAME'] || ENV['BUSHIDO_USER_EMAIL'].split('@').first, - :password => ActiveSupport::SecureRandom.base64(6) + :email => ENV['BUSHIDO_USER_EMAIL'], + :name => ENV['BUSHIDO_USER_NAME'] || ENV['BUSHIDO_USER_EMAIL'].split('@').first, + :bushido_user_id => ENV['BUSHIDO_USER_ID'], + :password => ActiveSupport::SecureRandom.base64(6) }) else # create an anonymous account right away @@ -44,14 +47,40 @@ namespace :bushido do when Net::HTTPSuccess, Net::HTTPFound `curl -L -s -o #{template_local_path} #{template_url}` + tmp, Locomotive.config.delayed_job = Locomotive.config.delayed_job, false # disable DJ during this import + Locomotive::Import::Job.run!(File.open(template_local_path), site, { :samples => true }) + + Locomotive.config.delayed_job = tmp # restore DJ flag else # do nothing end end + desc "Perform custom actions triggered by the Bushido hosting platform." + task :message => :environment do + event = ::Bushido::App.last_event + + puts "processing...#{event.inspect}" + + case event.category.to_s + when 'user' + case event.name.to_s + when 'create' + # an user has just claimed his application + account = Account.order_by(:created_at).first + + account.email = event.data['email'] + account.bushido_user_id = event.data['id'] + + account.save! + end + end + end + desc "Prepare an app to run on the Bushido hosting platform, called on every update. Called just before booting the app." task :update do + # re-built assets Jammit.package! end end From c68817c8c7bd3038d442fb9652057060e1b78d35 Mon Sep 17 00:00:00 2001 From: did Date: Fri, 27 May 2011 15:16:59 -0700 Subject: [PATCH 08/21] comment references to the bushido stub gem --- Gemfile | 2 +- config/environments/development.rb | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index b8615c5d..728998e0 100644 --- a/Gemfile +++ b/Gemfile @@ -45,7 +45,7 @@ end group :test, :development do gem 'ruby-debug', :platforms => :mri_18 gem 'ruby-debug19', :platforms => :mri_19 - gem 'bushido_stub', :path => '../gems/bushido_stub' + # gem 'bushido_stub', :path => '../gems/bushido_stub' end group :production do diff --git a/config/environments/development.rb b/config/environments/development.rb index c66e1a8b..85ed0423 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -30,11 +30,10 @@ Locomotive::Application.configure do # set up the bushido stub (uncomment it) # config.bushido_stub_env = false - - config.bushido_stub_env = { - 'APP_TLD' => 'bushi.do', - 'BUSHIDO_APP' => 'san_francisco', - 'BUSHIDO_HOST' => 'bushi.do', - 'LOCOMOTIVE_SITE_NAME' => 'Locomotive TEST' - } + # config.bushido_stub_env = { + # 'APP_TLD' => 'bushi.do', + # 'BUSHIDO_APP' => 'san_francisco', + # 'BUSHIDO_HOST' => 'bushi.do', + # 'LOCOMOTIVE_SITE_NAME' => 'Locomotive TEST' + # } end \ No newline at end of file From 1731536649d38fedb60a31aacbd07f709f3fa6cb Mon Sep 17 00:00:00 2001 From: did Date: Fri, 27 May 2011 15:23:42 -0700 Subject: [PATCH 09/21] new bushido gem --- Gemfile | 2 ++ Gemfile.lock | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 728998e0..7aed65b4 100644 --- a/Gemfile +++ b/Gemfile @@ -45,7 +45,9 @@ end group :test, :development do gem 'ruby-debug', :platforms => :mri_18 gem 'ruby-debug19', :platforms => :mri_19 + # gem 'bushido_stub', :path => '../gems/bushido_stub' + gem 'bushido' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 9d25c6b9..bc17b9e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,11 +11,6 @@ GIT xpath (0.1.2) nokogiri (~> 1.4) -PATH - remote: ../gems/bushido_stub - specs: - bushido_stub (0.0.1) - GEM remote: http://rubygems.org/ specs: @@ -274,7 +269,6 @@ DEPENDENCIES autotest bson_ext (~> 1.3.0) bushido - bushido_stub! capybara cucumber (= 0.8.5) cucumber-rails From d5f5707e426afcc7e61a8ee5e46e95b0c2e515b6 Mon Sep 17 00:00:00 2001 From: did Date: Fri, 27 May 2011 15:39:48 -0700 Subject: [PATCH 10/21] change the URL to the bushido js file --- lib/locomotive/hosting/bushido/middleware.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/locomotive/hosting/bushido/middleware.rb b/lib/locomotive/hosting/bushido/middleware.rb index d22e5b5b..d05820f6 100644 --- a/lib/locomotive/hosting/bushido/middleware.rb +++ b/lib/locomotive/hosting/bushido/middleware.rb @@ -5,7 +5,8 @@ module Locomotive module Bushido class Middleware - BUSHIDO_JS_URL = 'http://localhost:4567/javascripts/bushido.js' + # BUSHIDO_JS_URL = 'http://localhost:4567/javascripts/bushido.js' + BUSHIDO_JS_URL = 'http://bushi.do/api/bushido.js' include Rack::Utils From b467ecbeef251da215f0a0c69d01505ff718a252 Mon Sep 17 00:00:00 2001 From: did Date: Fri, 27 May 2011 16:24:11 -0700 Subject: [PATCH 11/21] display the bushido bar on every page --- lib/locomotive/hosting/bushido/middleware.rb | 40 +++++++++----------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/lib/locomotive/hosting/bushido/middleware.rb b/lib/locomotive/hosting/bushido/middleware.rb index d05820f6..58a67479 100644 --- a/lib/locomotive/hosting/bushido/middleware.rb +++ b/lib/locomotive/hosting/bushido/middleware.rb @@ -19,31 +19,27 @@ module Locomotive def call(env) status, headers, response = @app.call(env) - if env["PATH_INFO"] =~ /^\/admin\// - content = "" - response.each { |part| content += part } + content = "" + response.each { |part| content += part } - # "claiming" bar + stats ? - content.gsub!(/<\/body>/i, <<-STR - - - STR - ) + # "claiming" bar + stats ? + content.gsub!(/<\/body>/i, <<-STR + + + STR + ) - headers['content-length'] = bytesize(content).to_s + headers['content-length'] = bytesize(content).to_s - [status, headers, [content]] - else - [status, headers, response] - end + [status, headers, [content]] end end From c6b272f9f919d4b9a8a2e9798198ec23949014a8 Mon Sep 17 00:00:00 2001 From: did Date: Sat, 28 May 2011 10:52:36 -0700 Subject: [PATCH 12/21] disable authentication if the app has not been claimed yet --- Gemfile | 4 +-- Gemfile.lock | 6 ++++ app/controllers/admin/base_controller.rb | 6 +++- .../admin/cross_domain_sessions_controller.rb | 2 +- .../admin/installation_controller.rb | 2 +- app/controllers/admin/sitemaps_controller.rb | 2 +- config/environments/development.rb | 15 +++++----- lib/locomotive.rb | 4 +-- lib/locomotive/hosting/bushido.rb | 17 +++++++++-- lib/locomotive/hosting/bushido/devise.rb | 28 +++++++++++++++++++ lib/locomotive/hosting/bushido/middleware.rb | 2 +- 11 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 lib/locomotive/hosting/bushido/devise.rb diff --git a/Gemfile b/Gemfile index 7aed65b4..9177b6f5 100644 --- a/Gemfile +++ b/Gemfile @@ -46,8 +46,8 @@ group :test, :development do gem 'ruby-debug', :platforms => :mri_18 gem 'ruby-debug19', :platforms => :mri_19 - # gem 'bushido_stub', :path => '../gems/bushido_stub' - gem 'bushido' + gem 'bushido_stub', :path => '../gems/bushido_stub' + # gem 'bushido' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index bc17b9e2..9d25c6b9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,6 +11,11 @@ GIT xpath (0.1.2) nokogiri (~> 1.4) +PATH + remote: ../gems/bushido_stub + specs: + bushido_stub (0.0.1) + GEM remote: http://rubygems.org/ specs: @@ -269,6 +274,7 @@ DEPENDENCIES autotest bson_ext (~> 1.3.0) bushido + bushido_stub! capybara cucumber (= 0.8.5) cucumber-rails diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index 25d43a97..8277040e 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -5,7 +5,7 @@ module Admin layout '/admin/layouts/application' - before_filter :authenticate_admin! + before_filter :require_admin before_filter :require_site @@ -28,6 +28,10 @@ module Admin protected + def require_admin + authenticate_admin! + end + def begin_of_association_chain current_site end diff --git a/app/controllers/admin/cross_domain_sessions_controller.rb b/app/controllers/admin/cross_domain_sessions_controller.rb index a33d12be..1a0c42c2 100644 --- a/app/controllers/admin/cross_domain_sessions_controller.rb +++ b/app/controllers/admin/cross_domain_sessions_controller.rb @@ -7,7 +7,7 @@ module Admin skip_before_filter :validate_site_membership - before_filter :authenticate_admin!, :only => :new + before_filter :require_admin, :only => :new def new if site = current_admin.sites.detect { |s| s._id.to_s == params[:target_id] } diff --git a/app/controllers/admin/installation_controller.rb b/app/controllers/admin/installation_controller.rb index 77fc7d47..235fe62a 100644 --- a/app/controllers/admin/installation_controller.rb +++ b/app/controllers/admin/installation_controller.rb @@ -5,7 +5,7 @@ module Admin skip_before_filter :require_site - skip_before_filter :authenticate_admin! + skip_before_filter :require_admin skip_before_filter :verify_authenticity_token diff --git a/app/controllers/admin/sitemaps_controller.rb b/app/controllers/admin/sitemaps_controller.rb index 17bfcc5c..270ad84c 100644 --- a/app/controllers/admin/sitemaps_controller.rb +++ b/app/controllers/admin/sitemaps_controller.rb @@ -1,7 +1,7 @@ module Admin class SitemapsController < BaseController - skip_before_filter :authenticate_admin!, :validate_site_membership, :set_locale + skip_before_filter :require_admin, :validate_site_membership, :set_locale before_filter :require_site diff --git a/config/environments/development.rb b/config/environments/development.rb index 85ed0423..2105157e 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -4,7 +4,7 @@ Locomotive::Application.configure do # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the webserver when you make code changes. - config.cache_classes = false + config.cache_classes = true #false # Log error messages when you accidentally call methods on nil. config.whiny_nils = true @@ -30,10 +30,11 @@ Locomotive::Application.configure do # set up the bushido stub (uncomment it) # config.bushido_stub_env = false - # config.bushido_stub_env = { - # 'APP_TLD' => 'bushi.do', - # 'BUSHIDO_APP' => 'san_francisco', - # 'BUSHIDO_HOST' => 'bushi.do', - # 'LOCOMOTIVE_SITE_NAME' => 'Locomotive TEST' - # } + config.bushido_stub_env = { + 'APP_TLD' => 'bushi.do', + 'BUSHIDO_APP' => 'san_francisco', + 'BUSHIDO_HOST' => 'bushi.do', + 'LOCOMOTIVE_SITE_NAME' => 'Locomotive TEST', + 'BUSHIDO_CLAIMED' => 'true' + } end \ No newline at end of file diff --git a/lib/locomotive.rb b/lib/locomotive.rb index 54c5a1de..da89d64d 100644 --- a/lib/locomotive.rb +++ b/lib/locomotive.rb @@ -8,7 +8,6 @@ require 'locomotive/logger' require 'locomotive/liquid' require 'locomotive/mongoid' require 'locomotive/carrierwave' -require 'locomotive/hosting' require 'locomotive/custom_fields' require 'locomotive/httparty' require 'locomotive/inherited_resources' @@ -20,6 +19,7 @@ require 'locomotive/import' require 'locomotive/delayed_job' require 'locomotive/middlewares' require 'locomotive/session_store' +require 'locomotive/hosting' module Locomotive @@ -58,7 +58,7 @@ module Locomotive # Devise mail_address = self.config.mailer_sender - Devise.mailer_sender = mail_address =~ /.+@.+/ ? mail_address : "#{mail_address}@#{Locomotive.config.domain}" + ::Devise.mailer_sender = mail_address =~ /.+@.+/ ? mail_address : "#{mail_address}@#{Locomotive.config.domain}" # cookies stored in mongodb (mongoid_store) Rails.application.config.session_store :mongoid_store, { diff --git a/lib/locomotive/hosting/bushido.rb b/lib/locomotive/hosting/bushido.rb index 3977424c..441c6560 100644 --- a/lib/locomotive/hosting/bushido.rb +++ b/lib/locomotive/hosting/bushido.rb @@ -3,6 +3,7 @@ require 'locomotive/hosting/bushido/custom_domain' require 'locomotive/hosting/bushido/first_installation' require 'locomotive/hosting/bushido/account_ext' require 'locomotive/hosting/bushido/middleware' +require 'locomotive/hosting/bushido/devise' module Locomotive module Hosting @@ -24,27 +25,37 @@ module Locomotive (self.config.hosting == :auto && ENV['APP_TLD'] == 'bushi.do') end + def bushido_app_claimed? + ENV['BUSHIDO_CLAIMED'] && ENV['BUSHIDO_CLAIMED'].to_s.downcase == 'true' + end + def enable_bushido self.config.domain = ENV['APP_TLD'] unless self.config.multi_sites? - self.enhance_site_model_with_bushido + self.enhance_models_with_bushido + + self.disable_authentication_for_not_claimed_app self.setup_smtp_settings self.add_middleware - self.config.delayed_job = true # force the use of delayed_job + self.config.delayed_job = true # force to use delayed_job self.bushido_domains = ::Bushido::App.domains self.bushido_subdomain = ::Bushido::App.subdomain end - def enhance_site_model_with_bushido + def enhance_models_with_bushido Site.send :include, Locomotive::Hosting::Bushido::CustomDomain Site.send :include, Locomotive::Hosting::Bushido::FirstInstallation Account.send :include, Locomotive::Hosting::Bushido::AccountExt end + def disable_authentication_for_not_claimed_app + Admin::BaseController.send :include, Locomotive::Hosting::Bushido::Devise + end + def setup_smtp_settings ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.smtp_settings = { diff --git a/lib/locomotive/hosting/bushido/devise.rb b/lib/locomotive/hosting/bushido/devise.rb new file mode 100644 index 00000000..1c591c4c --- /dev/null +++ b/lib/locomotive/hosting/bushido/devise.rb @@ -0,0 +1,28 @@ +module Locomotive + module Hosting + module Bushido + module Devise + + extend ActiveSupport::Concern + + included do + alias_method_chain :require_admin, :bushido + end + + module InstanceMethods + + def require_admin_with_bushido + if ::Locomotive.bushido_app_claimed? + require_admin_without_bushido + else + # open back-office for everybody as long as the application has not been claimed + sign_in(Account.order_by(:created_at).first) + end + end + + end + + end + end + end +end \ No newline at end of file diff --git a/lib/locomotive/hosting/bushido/middleware.rb b/lib/locomotive/hosting/bushido/middleware.rb index 58a67479..3a0cde73 100644 --- a/lib/locomotive/hosting/bushido/middleware.rb +++ b/lib/locomotive/hosting/bushido/middleware.rb @@ -13,7 +13,7 @@ module Locomotive def initialize(app, opts = {}) @app = app @bushido_app_name = ENV['BUSHIDO_APP'] - @bushido_claimed = ENV['BUSHIDO_CLAIMED'] && ENV['BUSHIDO_CLAIMED'].to_s.downcase == 'true' + @bushido_claimed = ::Locomotive.bushido_app_claimed? end def call(env) From 61886ec1b1eb6f6bc4a1b7124117a47855c2cb23 Mon Sep 17 00:00:00 2001 From: did Date: Sat, 28 May 2011 19:45:29 -0700 Subject: [PATCH 13/21] installation procedure allows to install the default site template if provided --- .../admin/installation_controller.rb | 12 ++------ .../extensions/site/first_installation.rb | 18 ++++++++++++ app/views/admin/installation/step_2.html.haml | 10 ++++++- config/assets.yml | 3 ++ config/environments/development.rb | 16 +++++------ config/locales/admin_ui.en.yml | 3 +- config/locales/formtastic.en.yml | 1 + lib/locomotive.rb | 10 ++++++- lib/locomotive/hosting/bushido/devise.rb | 2 +- public/javascripts/admin/installation.js | 17 +++++++++++ public/stylesheets/admin/installation.css | 28 +++++++++++++------ 11 files changed, 91 insertions(+), 29 deletions(-) create mode 100644 public/javascripts/admin/installation.js diff --git a/app/controllers/admin/installation_controller.rb b/app/controllers/admin/installation_controller.rb index 235fe62a..acf19cee 100644 --- a/app/controllers/admin/installation_controller.rb +++ b/app/controllers/admin/installation_controller.rb @@ -42,13 +42,7 @@ module Admin @site = Site.create_first_one(params[:site]) if @site.valid? - begin - unless params[:zipfile].blank? - Locomotive::Import::Job.run!(params[:zipfile], @site, { :samples => true }) - end - rescue Exception => e - logger.error "Import failed because of #{e.message}" - end + Site.install_template(@site, params) redirect_to last_url else @@ -61,8 +55,8 @@ module Admin def is_step_already_done? case params[:step].to_i when 1 # already an account in db - if Account.count > 0 - @step_done = t('admin.installation.step_1.done', Account.first.attributes) + if account = Account.first + @step_done = I18n.t('admin.installation.step_1.done', :name => account.name, :email => account.email) render 'step_1' and return false end else diff --git a/app/models/extensions/site/first_installation.rb b/app/models/extensions/site/first_installation.rb index a1eba9ac..f38d92ac 100644 --- a/app/models/extensions/site/first_installation.rb +++ b/app/models/extensions/site/first_installation.rb @@ -13,6 +13,24 @@ module Extensions site end + def install_template(site, options = {}) + default_template = Boolean.set(options.delete(:default_site_template)) || false + + zipfile = options.delete(:zipfile) + + # do not try to process anything if said so + return unless default_template || zipfile.present? + + # default template options has a higher priority than the zipfile + source = default_template ? Locomotive.default_site_template_path : zipfile + + begin + Locomotive::Import::Job.run!(source, site, { :samples => true }) + rescue Exception => e + logger.error "The import of the site template failed because of #{e.message}" + end + end + end end end \ No newline at end of file diff --git a/app/views/admin/installation/step_2.html.haml b/app/views/admin/installation/step_2.html.haml index 86a11a85..a846a4d9 100644 --- a/app/views/admin/installation/step_2.html.haml +++ b/app/views/admin/installation/step_2.html.haml @@ -5,6 +5,7 @@ - content_for :head do = include_stylesheets :installation + = include_javascripts :installation = semantic_form_for(@site, :url => admin_installation_step_url(2), :html => { :multipart => true }) do |f| .inner @@ -18,9 +19,16 @@ - if multi_sites? = f.input :subdomain, :required => true - %li{ :class => 'string optional', :id => 'zipfile_input' } + - if Locomotive.default_site_template_present? + %li{ :class => 'question', :id => 'default_site_template_input' } + = check_box_tag 'default_site_template', '1', params[:default_site_template].blank? || params[:default_site_template] == '1' + %label{ :for => 'default_site_template' }!= t('formtastic.labels.import.new.default_site_template') + + %li{ :class => 'string optional', :id => 'zipfile_input', :style => "#{'display: none' if Locomotive.default_site_template_present?}" } %label{ :for => 'zipfile' }= t('formtastic.labels.import.new.source') = file_field_tag 'zipfile' + - if Locomotive.default_site_template_present? + %p.inline-hints!= t('.back_to_default_template') .footer = box_button_tag t('.next') \ No newline at end of file diff --git a/config/assets.yml b/config/assets.yml index d2943364..08194ecd 100644 --- a/config/assets.yml +++ b/config/assets.yml @@ -7,6 +7,9 @@ s3_secret_access_key: <%= ENV['S3_SECRET_KEY'] %> javascripts: box: - public/javascripts/admin/jquery.js + installation: + - public/javascripts/admin/jquery.js + - public/javascripts/admin/installation.js common: - public/javascripts/admin/jquery.js - public/javascripts/admin/jquery.ui.js diff --git a/config/environments/development.rb b/config/environments/development.rb index 2105157e..1f07c786 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -4,7 +4,7 @@ Locomotive::Application.configure do # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the webserver when you make code changes. - config.cache_classes = true #false + config.cache_classes = false # Log error messages when you accidentally call methods on nil. config.whiny_nils = true @@ -30,11 +30,11 @@ Locomotive::Application.configure do # set up the bushido stub (uncomment it) # config.bushido_stub_env = false - config.bushido_stub_env = { - 'APP_TLD' => 'bushi.do', - 'BUSHIDO_APP' => 'san_francisco', - 'BUSHIDO_HOST' => 'bushi.do', - 'LOCOMOTIVE_SITE_NAME' => 'Locomotive TEST', - 'BUSHIDO_CLAIMED' => 'true' - } + # config.bushido_stub_env = { + # 'APP_TLD' => 'bushi.do', + # 'BUSHIDO_APP' => 'san_francisco', + # 'BUSHIDO_HOST' => 'bushi.do', + # 'LOCOMOTIVE_SITE_NAME' => 'Locomotive TEST', + # 'BUSHIDO_CLAIMED' => 'true' + # } end \ No newline at end of file diff --git a/config/locales/admin_ui.en.yml b/config/locales/admin_ui.en.yml index 7fe09a44..12648f3d 100644 --- a/config/locales/admin_ui.en.yml +++ b/config/locales/admin_ui.en.yml @@ -289,5 +289,6 @@ en: next: Create account step_2: title: "Step 2/2 — Create your first site" - explanations: "This is the last step of the installation. You can upload a theme as a zip file. We have free available themes here." + explanations: "If you already uploaded the default site template (see instructions), you can use it right away. Or you can upload a site template as a zip file (free available templates here)." + back_to_default_template: "Click here to select the default site template instead" next: Create site diff --git a/config/locales/formtastic.en.yml b/config/locales/formtastic.en.yml index 0e11199f..0738c3c2 100644 --- a/config/locales/formtastic.en.yml +++ b/config/locales/formtastic.en.yml @@ -36,6 +36,7 @@ en: source: File samples: Copy samples reset: Reset site + default_site_template: "Use the default site template. Click here to upload a site template as a zip file instead." content_type: api_accounts: Notified Accounts account: diff --git a/lib/locomotive.rb b/lib/locomotive.rb index da89d64d..6d49cb32 100644 --- a/lib/locomotive.rb +++ b/lib/locomotive.rb @@ -39,6 +39,14 @@ module Locomotive self.const_defined?('Engine') end + def self.default_site_template_present? + File.exists?(self.default_site_template_path) + end + + def self.default_site_template_path + File.join(Rails.root, 'tmp/default_site_template.zip') + end + def self.configure self.config ||= Configuration.new @@ -96,7 +104,7 @@ module Locomotive if self.config.multi_sites? self.config.manage_subdomain = self.config.manage_domains = true else - # Note: (Did) modify the code below if Locomotive handles a new hosting solution + # Note: (Did) modify the code below if Locomotive handles a new hosting solution (not a perfect solution though) self.config.manage_domains = self.heroku? || self.bushido? self.config.manage_subdomain = self.bushido? end diff --git a/lib/locomotive/hosting/bushido/devise.rb b/lib/locomotive/hosting/bushido/devise.rb index 1c591c4c..c58dfcca 100644 --- a/lib/locomotive/hosting/bushido/devise.rb +++ b/lib/locomotive/hosting/bushido/devise.rb @@ -15,7 +15,7 @@ module Locomotive if ::Locomotive.bushido_app_claimed? require_admin_without_bushido else - # open back-office for everybody as long as the application has not been claimed + # open back-office for everybody as long as the application is not claimed sign_in(Account.order_by(:created_at).first) end end diff --git a/public/javascripts/admin/installation.js b/public/javascripts/admin/installation.js new file mode 100644 index 00000000..0f78fc31 --- /dev/null +++ b/public/javascripts/admin/installation.js @@ -0,0 +1,17 @@ +$(document).ready(function() { + + $('#default_site_template_input label a').click(function(e) { + $('#default_site_template_input input[type=checkbox]').attr('checked', ''); + $('#default_site_template_input').hide(); + $('#zipfile_input').show(); + e.preventDefault(); + }); + + $('#zipfile_input p.inline-hints a').click(function(e) { + $('#default_site_template_input input[type=checkbox]').attr('checked', 'checked'); + $('#zipfile_input').hide(); + $('#default_site_template_input').show(); + e.preventDefault(); + }); + +}); \ No newline at end of file diff --git a/public/stylesheets/admin/installation.css b/public/stylesheets/admin/installation.css index 423f9925..288d41d1 100644 --- a/public/stylesheets/admin/installation.css +++ b/public/stylesheets/admin/installation.css @@ -4,20 +4,20 @@ color: #222; } -#panel .inner p.explanations { - margin-top: 10px; - font-size: 1.2em; -} - -#panel .inner p.explanations a { +#panel .inner a { color: #1F82BC; text-decoration: none; } -#panel .inner p.explanations a:hover { +#panel .inner a:hover { text-decoration: underline; } +#panel .inner p.explanations { + margin-top: 10px; + font-size: 1.2em; +} + #panel .inner p.done { margin: 20px 0px 15px; font-size: 1.2em; @@ -45,6 +45,18 @@ } #panel .inner dd p { - +} + +/* ___ custom ___ */ + +#panel fieldset ol li.question input[type=checkbox] { + display: inline; + width: auto; + margin-right: 10px; +} + +#panel fieldset ol li.question label { + display: inline; + font-weight: normal; } From eb56779370b28bbdd20b9efb4b479b0139b8a9db Mon Sep 17 00:00:00 2001 From: did Date: Sat, 28 May 2011 20:00:10 -0700 Subject: [PATCH 14/21] replace theme by template (better wording) --- config/locales/admin_ui.en.yml | 4 ++-- config/locales/admin_ui.fr.yml | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/config/locales/admin_ui.en.yml b/config/locales/admin_ui.en.yml index 12648f3d..da955813 100644 --- a/config/locales/admin_ui.en.yml +++ b/config/locales/admin_ui.en.yml @@ -259,8 +259,8 @@ en: imports: new: - title: Import - help: "Be careful when you upload a new theme for your existing website, your current data could be modified or even removed." + title: Import site template + help: "Be careful when you upload a new template for your existing website, your current data could be modified or even removed." show: title: Import in progress help: "Your site is being updated from the theme zip file you have just uploaded. It lasts a couple of seconds." diff --git a/config/locales/admin_ui.fr.yml b/config/locales/admin_ui.fr.yml index 331a828d..9e7671ad 100644 --- a/config/locales/admin_ui.fr.yml +++ b/config/locales/admin_ui.fr.yml @@ -258,8 +258,8 @@ fr: imports: new: - title: Import - help: "Faites attention quand vous envoyez un nouveau theme sur votre site, les données de celui-ci pourront être modifiées voire même supprimées." + title: Importer template de site + help: "Faites attention quand vous envoyez un nouveau template sur votre site, les données de celui-ci pourront être modifiées voire même supprimées." show: title: Import en cours help: "Votre site est en train d'être mis à jour à partir du fichier zip précédemment envoyé sur le serveur. Cette opération peut durer quelques secondes." @@ -288,5 +288,6 @@ fr: next: Créer compte step_2: title: "Étape 2/2 — Créer votre premier site" - explanations: "C'est la dernière étape de l'installation. Vous pouvez uploader un theme sous forme d'un fichier zip. Nous avons quelques themes disponibles ici." + explanations: "Si vous avez déjà uploadé le template de site par défaut (voir instructions), vous pouvez l'utiliser dès maintenant. Ou vous pouvez uploader un template de site sous forme d'un fichier zip (quelques themes disponibles ici)." + back_to_default_template: "Cliquez ici pour sélectionner à la place le template de site par défault" next: Créer site \ No newline at end of file From 36e5d6d55da2a5aa8bec11817b7f8d18f7e97266 Mon Sep 17 00:00:00 2001 From: did Date: Sun, 29 May 2011 13:32:31 -0700 Subject: [PATCH 15/21] Launch user into backoffice on first deploy --- config/bushido.json | 11 ++++++----- doc/TODO | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/config/bushido.json b/config/bushido.json index 79139bf8..85adbc0c 100644 --- a/config/bushido.json +++ b/config/bushido.json @@ -1,7 +1,8 @@ { - "platform": "rails", - "platform_version": 3, - "ruby_version": "1.9.2", - "sql": false, - "mongodb": true + "platform": "rails", + "platform_version": 3, + "ruby_version": "1.9.2", + "sql": false, + "mongodb": true, + "start_page": "admin" } diff --git a/doc/TODO b/doc/TODO index 7eb36344..0c45ca12 100644 --- a/doc/TODO +++ b/doc/TODO @@ -15,7 +15,7 @@ BACKLOG: - edit images (upload new ones, ...etc) => wait for aloha or send them an email ? - global regions: keyword in editable element (http://www.mongodb.org/display/DOCS/Updating) - cucumber features for admin pages (in progress) -(- duostack version) +(- duostack/doutcloud version) - icon for redirection page in the pages section (back-office) - write my first tutorial about locomotive - upgrade warning if new version of locomotive (maybe based on the commit id) From 20fd07409bc68b0df735e2b6590e56426fdcc4cd Mon Sep 17 00:00:00 2001 From: did Date: Sun, 29 May 2011 14:47:18 -0700 Subject: [PATCH 16/21] bushido stub gem --- Gemfile | 3 ++- Gemfile.lock | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 9177b6f5..b6b1d0fd 100644 --- a/Gemfile +++ b/Gemfile @@ -46,7 +46,8 @@ group :test, :development do gem 'ruby-debug', :platforms => :mri_18 gem 'ruby-debug19', :platforms => :mri_19 - gem 'bushido_stub', :path => '../gems/bushido_stub' + gem 'bushido_stub', :git => 'git://github.com/did/bushido_stub.git' + # :path => '../gems/bushido_stub' # gem 'bushido' end diff --git a/Gemfile.lock b/Gemfile.lock index 9d25c6b9..b5638138 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,10 @@ +GIT + remote: git://github.com/did/bushido_stub.git + revision: 6b83b2c4847832ffe7a213e725d2ceb7f864e360 + specs: + bushido_stub (0.0.1) + activesupport (>= 3.0.7) + GIT remote: git://github.com/floehopper/mocha.git revision: 6da1242f26b12a24c4fcf67bf5921a25bc1bc88d @@ -11,11 +18,6 @@ GIT xpath (0.1.2) nokogiri (~> 1.4) -PATH - remote: ../gems/bushido_stub - specs: - bushido_stub (0.0.1) - GEM remote: http://rubygems.org/ specs: From 90ab471e43053da2c253d3e20d141fae0e66a5eb Mon Sep 17 00:00:00 2001 From: did Date: Sun, 29 May 2011 15:19:36 -0700 Subject: [PATCH 17/21] modify start page to go directly to the pages section --- config/bushido.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/bushido.json b/config/bushido.json index 85adbc0c..5d646519 100644 --- a/config/bushido.json +++ b/config/bushido.json @@ -4,5 +4,5 @@ "ruby_version": "1.9.2", "sql": false, "mongodb": true, - "start_page": "admin" + "start_page": "admin/pages" } From dfb4ed48bcabf75e73e4e8cd9562a47df6866df4 Mon Sep 17 00:00:00 2001 From: did Date: Sun, 29 May 2011 15:25:36 -0700 Subject: [PATCH 18/21] refactor bushido message to event --- lib/tasks/bushido.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/bushido.rake b/lib/tasks/bushido.rake index a2bdcfd2..972c8ffd 100644 --- a/lib/tasks/bushido.rake +++ b/lib/tasks/bushido.rake @@ -58,7 +58,7 @@ namespace :bushido do end desc "Perform custom actions triggered by the Bushido hosting platform." - task :message => :environment do + task :event => :environment do event = ::Bushido::App.last_event puts "processing...#{event.inspect}" From 293557a245fa0ce09464887ac229045408f1d4f9 Mon Sep 17 00:00:00 2001 From: did Date: Sun, 29 May 2011 15:36:14 -0700 Subject: [PATCH 19/21] fix a problem with bushido_app_claimed? if the variable value is an empty string --- lib/locomotive/hosting/bushido.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/locomotive/hosting/bushido.rb b/lib/locomotive/hosting/bushido.rb index 441c6560..fa11d805 100644 --- a/lib/locomotive/hosting/bushido.rb +++ b/lib/locomotive/hosting/bushido.rb @@ -26,7 +26,7 @@ module Locomotive end def bushido_app_claimed? - ENV['BUSHIDO_CLAIMED'] && ENV['BUSHIDO_CLAIMED'].to_s.downcase == 'true' + ENV['BUSHIDO_CLAIMED'].present? && ENV['BUSHIDO_CLAIMED'].to_s.downcase == 'true' end def enable_bushido From 6834e6db8517fb3bcaf4ca56da7c5712f2ee51f7 Mon Sep 17 00:00:00 2001 From: Sean Grove Date: Mon, 30 May 2011 14:17:42 -0700 Subject: [PATCH 20/21] Tweaks to match the Bushido Events api --- lib/tasks/bushido.rake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/tasks/bushido.rake b/lib/tasks/bushido.rake index 972c8ffd..8753b888 100644 --- a/lib/tasks/bushido.rake +++ b/lib/tasks/bushido.rake @@ -59,19 +59,19 @@ namespace :bushido do desc "Perform custom actions triggered by the Bushido hosting platform." task :event => :environment do - event = ::Bushido::App.last_event + event = ::Bushido::Event.last puts "processing...#{event.inspect}" case event.category.to_s - when 'user' + when 'app' case event.name.to_s - when 'create' + when 'claim' # an user has just claimed his application account = Account.order_by(:created_at).first - account.email = event.data['email'] - account.bushido_user_id = event.data['id'] + account.email = event.data['bushido_user_email'] + account.bushido_user_id = event.data['bushido_user_id'] account.save! end From d557af74ead323c2fca672e6c79ab1b6b32bbd3f Mon Sep 17 00:00:00 2001 From: Sean Grove Date: Mon, 30 May 2011 14:32:34 -0700 Subject: [PATCH 21/21] Typo --- lib/tasks/bushido.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/bushido.rake b/lib/tasks/bushido.rake index 8753b888..6897d464 100644 --- a/lib/tasks/bushido.rake +++ b/lib/tasks/bushido.rake @@ -66,7 +66,7 @@ namespace :bushido do case event.category.to_s when 'app' case event.name.to_s - when 'claim' + when 'claimed' # an user has just claimed his application account = Account.order_by(:created_at).first