lipsiadmin 4.1.8 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. data/CHANGELOG +41 -2
  2. data/lib/access_control/authentication.rb +1 -1
  3. data/lib/access_control/base.rb +18 -11
  4. data/lib/controller/ext.rb +5 -3
  5. data/lib/controller/pdf_builder.rb +22 -6
  6. data/lib/controller/responds_to_parent.rb +1 -1
  7. data/lib/data_base/attachment_table.rb +0 -1
  8. data/lib/lipsiadmin.rb +7 -0
  9. data/lib/mailer/pdf_builder.rb +23 -9
  10. data/lib/version.rb +3 -3
  11. data/lib/view/helpers/backend_helper.rb +137 -97
  12. data/lib/view/helpers/ext/button.rb +62 -0
  13. data/lib/view/helpers/ext/column_model.rb +29 -23
  14. data/lib/view/helpers/ext/component.rb +52 -40
  15. data/lib/view/helpers/ext/configuration.rb +3 -2
  16. data/lib/view/helpers/ext/grid.rb +38 -40
  17. data/lib/view/helpers/ext/store.rb +12 -12
  18. data/lib/view/helpers/ext/templates/grid_functions.js.erb +14 -9
  19. data/lib/view/helpers/ext/tool_bar.rb +9 -10
  20. data/lib/view/helpers/ext_helper.rb +3 -2
  21. data/lib/view/helpers/pdf_helper.rb +45 -0
  22. data/lipsiadmin_generators/attachment/REMEMBER +0 -4
  23. data/lipsiadmin_generators/attachment/templates/migration.rb +1 -1
  24. data/lipsiadmin_generators/backend/templates/config/config.yml +2 -3
  25. data/lipsiadmin_generators/backend/templates/config/locales/backend/en.yml +2 -0
  26. data/lipsiadmin_generators/backend/templates/config/locales/backend/it.yml +2 -0
  27. data/lipsiadmin_generators/backend/templates/config/locales/models/{en.yml → account/en.yml} +0 -0
  28. data/lipsiadmin_generators/backend/templates/config/locales/models/{it.yml → account/it.yml} +0 -0
  29. data/lipsiadmin_generators/backend/templates/controllers/javascripts_controller.rb +1 -1
  30. data/lipsiadmin_generators/backend/templates/images/backend/association_break.png +0 -0
  31. data/lipsiadmin_generators/backend/templates/images/backend/association_ok.png +0 -0
  32. data/lipsiadmin_generators/backend/templates/images/backend/categories.gif +0 -0
  33. data/lipsiadmin_generators/backend/templates/images/ext/charts.swf +0 -0
  34. data/lipsiadmin_generators/backend/templates/images/ext/{slate/sizer/se-handle.gif → default/button/arrow.gif} +0 -0
  35. data/lipsiadmin_generators/backend/templates/images/ext/default/button/btn.gif +0 -0
  36. data/lipsiadmin_generators/backend/templates/images/ext/default/button/group-cs.gif +0 -0
  37. data/lipsiadmin_generators/backend/templates/images/ext/{slate/grid/grid-blue-split.gif → default/button/group-lr.gif} +0 -0
  38. data/lipsiadmin_generators/backend/templates/images/ext/{slate/grid/arrow-right-white.gif → default/button/group-tb.gif} +0 -0
  39. data/lipsiadmin_generators/backend/templates/images/ext/default/button/s-arrow-b-noline.gif +0 -0
  40. data/lipsiadmin_generators/backend/templates/images/ext/default/button/s-arrow-b.gif +0 -0
  41. data/lipsiadmin_generators/backend/templates/images/ext/default/button/s-arrow-bo.gif +0 -0
  42. data/lipsiadmin_generators/backend/templates/images/ext/{slate/grid/grid3-hrow.gif → default/button/s-arrow-noline.gif} +0 -0
  43. data/lipsiadmin_generators/backend/templates/images/ext/default/button/s-arrow-o.gif +0 -0
  44. data/lipsiadmin_generators/backend/templates/images/ext/default/button/s-arrow.gif +0 -0
  45. data/lipsiadmin_generators/backend/templates/images/ext/default/form/checkbox.gif +0 -0
  46. data/lipsiadmin_generators/backend/templates/images/ext/default/form/radio.gif +0 -0
  47. data/lipsiadmin_generators/backend/templates/images/ext/default/form/trigger.gif +0 -0
  48. data/lipsiadmin_generators/backend/templates/images/ext/default/grid/group-collapse.gif +0 -0
  49. data/lipsiadmin_generators/backend/templates/images/ext/default/grid/group-expand.gif +0 -0
  50. data/lipsiadmin_generators/backend/templates/images/ext/default/grid/refresh.gif +0 -0
  51. data/lipsiadmin_generators/backend/templates/images/ext/default/grid/sort-hd.gif +0 -0
  52. data/lipsiadmin_generators/backend/templates/images/ext/default/panel/tool-sprites.gif +0 -0
  53. data/lipsiadmin_generators/backend/templates/images/ext/default/panel/tools-sprites-trans.gif +0 -0
  54. data/lipsiadmin_generators/backend/templates/images/ext/default/qtip/tip-anchor-sprite.gif +0 -0
  55. data/lipsiadmin_generators/backend/templates/images/ext/default/shadow-c.png +0 -0
  56. data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-bg.png +0 -0
  57. data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-thumb.png +0 -0
  58. data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-v-bg.png +0 -0
  59. data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-v-thumb.png +0 -0
  60. data/lipsiadmin_generators/backend/templates/images/ext/{slate/grid/arrow-left-white.gif → default/toolbar/more.gif} +0 -0
  61. data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/tb-xl-btn-sprite.gif +0 -0
  62. data/lipsiadmin_generators/backend/templates/images/ext/{slate/panel/left-right.gif → default/toolbar/tb-xl-sep.gif} +0 -0
  63. data/lipsiadmin_generators/backend/templates/images/ext/default/window/left-corners.png +0 -0
  64. data/lipsiadmin_generators/backend/templates/images/ext/default/window/left-right.png +0 -0
  65. data/lipsiadmin_generators/backend/templates/images/ext/default/window/left-right.psd +0 -0
  66. data/lipsiadmin_generators/backend/templates/images/ext/default/window/right-corners.png +0 -0
  67. data/lipsiadmin_generators/backend/templates/images/ext/default/window/top-bottom.png +0 -0
  68. data/lipsiadmin_generators/backend/templates/images/ext/default/window/top-bottom.psd +0 -0
  69. data/lipsiadmin_generators/backend/templates/images/ext/expressinstall.swf +0 -0
  70. data/lipsiadmin_generators/backend/templates/javascripts/ext.js +97 -76
  71. data/lipsiadmin_generators/backend/templates/javascripts/prototype.js +14 -12
  72. data/lipsiadmin_generators/backend/templates/models/notifier.rb +1 -1
  73. data/lipsiadmin_generators/backend/templates/stylesheets/backend.css +11 -2
  74. data/lipsiadmin_generators/backend/templates/stylesheets/ext.css +1070 -546
  75. data/lipsiadmin_generators/backend/templates/stylesheets/login.css +1 -0
  76. data/lipsiadmin_generators/backend/templates/views/backend/accounts/index.rjs +1 -0
  77. data/lipsiadmin_generators/backend/templates/views/backend/base/index.html.haml +7 -4
  78. data/lipsiadmin_generators/backend/templates/views/javascripts/backend.js.erb +203 -143
  79. data/lipsiadmin_generators/pdf/pdf_generator.rb +1 -4
  80. data/lipsiadmin_generators/pdf/templates/view.html.haml +11 -6
  81. data/lipsiadmin_generators/state_session/state_session_generator.rb +2 -0
  82. data/resources/javascripts/ux.js +16 -17
  83. data/resources/javascripts/ux.min.js +2 -0
  84. data/resources/pd4ml/ruby/Pd4Ruby.class +0 -0
  85. data/resources/pd4ml/ruby/Pd4Ruby.java +277 -31
  86. data/tasks/lipsiadmin_tasks.rake +18 -1
  87. metadata +32 -124
  88. data/lipsiadmin_generators/backend/templates/images/ext/default/box/tb-slate.gif +0 -0
  89. data/lipsiadmin_generators/backend/templates/images/ext/default/button/btn-arrow.gif +0 -0
  90. data/lipsiadmin_generators/backend/templates/images/ext/default/button/btn-sprite.gif +0 -0
  91. data/lipsiadmin_generators/backend/templates/images/ext/default/grid/Thumbs.db +0 -0
  92. data/lipsiadmin_generators/backend/templates/images/ext/slate/button/btn-arrow.gif +0 -0
  93. data/lipsiadmin_generators/backend/templates/images/ext/slate/button/btn-sprite.gif +0 -0
  94. data/lipsiadmin_generators/backend/templates/images/ext/slate/editor/tb-sprite.gif +0 -0
  95. data/lipsiadmin_generators/backend/templates/images/ext/slate/form/checkbox.gif +0 -0
  96. data/lipsiadmin_generators/backend/templates/images/ext/slate/form/clear-trigger.gif +0 -0
  97. data/lipsiadmin_generators/backend/templates/images/ext/slate/form/date-trigger.gif +0 -0
  98. data/lipsiadmin_generators/backend/templates/images/ext/slate/form/radio.gif +0 -0
  99. data/lipsiadmin_generators/backend/templates/images/ext/slate/form/search-trigger.gif +0 -0
  100. data/lipsiadmin_generators/backend/templates/images/ext/slate/form/trigger-tpl.gif +0 -0
  101. data/lipsiadmin_generators/backend/templates/images/ext/slate/form/trigger.gif +0 -0
  102. data/lipsiadmin_generators/backend/templates/images/ext/slate/gradient-bg.gif +0 -0
  103. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/col-move-bottom.gif +0 -0
  104. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/col-move-top.gif +0 -0
  105. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/footer-bg.gif +0 -0
  106. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-blue-hd.gif +0 -0
  107. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-hrow.gif +0 -0
  108. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-split.gif +0 -0
  109. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-vista-hd.gif +0 -0
  110. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-hd-btn.gif +0 -0
  111. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-hrow-over.gif +0 -0
  112. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-special-col-bg.gif +0 -0
  113. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-special-col-sel-bg.gif +0 -0
  114. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/group-expand-sprite.gif +0 -0
  115. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/mso-hd.gif +0 -0
  116. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-first-disabled.gif +0 -0
  117. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-first.gif +0 -0
  118. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-last-disabled.gif +0 -0
  119. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-last.gif +0 -0
  120. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-next-disabled.gif +0 -0
  121. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-next.gif +0 -0
  122. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-prev-disabled.gif +0 -0
  123. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-prev.gif +0 -0
  124. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/refresh.gif +0 -0
  125. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/row-over.gif +0 -0
  126. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/row-sel.gif +0 -0
  127. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/sort_asc.gif +0 -0
  128. data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/sort_desc.gif +0 -0
  129. data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/checked.gif +0 -0
  130. data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/group-checked.gif +0 -0
  131. data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/item-over - Copy.gif +0 -0
  132. data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/item-over.gif +0 -0
  133. data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/menu-parent.gif +0 -0
  134. data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/menu.gif +0 -0
  135. data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/unchecked.gif +0 -0
  136. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/corners-sprite.gif +0 -0
  137. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/light-hd.gif +0 -0
  138. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/tool-sprite-tpl.gif +0 -0
  139. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/tool-sprites.gif +0 -0
  140. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/tools-sprites-trans.gif +0 -0
  141. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/top-bottom.gif +0 -0
  142. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/top-bottom.png +0 -0
  143. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/white-corners-sprite.gif +0 -0
  144. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/white-left-right.gif +0 -0
  145. data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/white-top-bottom.gif +0 -0
  146. data/lipsiadmin_generators/backend/templates/images/ext/slate/progress/progress-bg.gif +0 -0
  147. data/lipsiadmin_generators/backend/templates/images/ext/slate/qtip/bg.gif +0 -0
  148. data/lipsiadmin_generators/backend/templates/images/ext/slate/qtip/close.gif +0 -0
  149. data/lipsiadmin_generators/backend/templates/images/ext/slate/qtip/tip-sprite.gif +0 -0
  150. data/lipsiadmin_generators/backend/templates/images/ext/slate/s.gif +0 -0
  151. data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/glass-bg.gif +0 -0
  152. data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/hd-sprite.gif +0 -0
  153. data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/left-btn.gif +0 -0
  154. data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/right-btn.gif +0 -0
  155. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/e-handle-dark.gif +0 -0
  156. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/e-handle.gif +0 -0
  157. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/ne-handle-dark.gif +0 -0
  158. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/ne-handle.gif +0 -0
  159. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/nw-handle-dark.gif +0 -0
  160. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/nw-handle.gif +0 -0
  161. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/s-handle-dark.gif +0 -0
  162. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/s-handle.gif +0 -0
  163. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/se-handle-dark.gif +0 -0
  164. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/square.gif +0 -0
  165. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/sw-handle-dark.gif +0 -0
  166. data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/sw-handle.gif +0 -0
  167. data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-bg.png +0 -0
  168. data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-thumb.png +0 -0
  169. data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-v-bg.png +0 -0
  170. data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-v-thumb.png +0 -0
  171. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/scroll-left.gif +0 -0
  172. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/scroll-right.gif +0 -0
  173. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/scroller-bg.gif +0 -0
  174. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-inactive-left-bg.gif +0 -0
  175. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-inactive-right-bg.gif +0 -0
  176. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-left-bg.gif +0 -0
  177. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-right-bg.gif +0 -0
  178. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-close.gif +0 -0
  179. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-strip-bg.gif +0 -0
  180. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-strip-bg.png +0 -0
  181. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-strip-btm-bg.gif +0 -0
  182. data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tabs-sprite.gif +0 -0
  183. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/bg-menu.png +0 -0
  184. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/bg.gif +0 -0
  185. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/btn-arrow-light.gif +0 -0
  186. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/btn-arrow.gif +0 -0
  187. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/btn-over-bg.gif +0 -0
  188. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/gray-bg.gif +0 -0
  189. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/tb-bg.gif +0 -0
  190. data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/tb-btn-sprite.gif +0 -0
  191. data/lipsiadmin_generators/backend/templates/images/ext/slate/tree/arrows.gif +0 -0
  192. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-error.gif +0 -0
  193. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-info.gif +0 -0
  194. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-question.gif +0 -0
  195. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-warning.gif +0 -0
  196. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/left-corners.png +0 -0
  197. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/left-right.png +0 -0
  198. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/right-corners.png +0 -0
  199. data/lipsiadmin_generators/backend/templates/images/ext/slate/window/top-bottom.png +0 -0
  200. data/lipsiadmin_generators/backend/templates/stylesheets/backend-slate.css +0 -105
  201. data/lipsiadmin_generators/backend/templates/stylesheets/ext-slate.css +0 -241
@@ -18,5 +18,6 @@ h2 { color:#525151; font-size:18px; margin:0px 0px 15px 0px; padding:0; }
18
18
  #content_intro { text-align:center; margin:210px 0px 0px 0px; color: #525151;}
19
19
  #content_intro a { color: #525151;}
20
20
  #copyright { position:absolute; top:100%; left:20px; margin-top:-30px; color:#FFF; }
21
+ /* Classes */
21
22
  .field { padding-bottom:5px; }
22
23
  .bottom { color:#0BB1E1; margin-top:20px; }
@@ -8,6 +8,7 @@ page.grid do |grid|
8
8
  grid.store do |store|
9
9
  store.url "/backend/accounts.json"
10
10
  store.fields @column_store.store_fields
11
+ store.sortInfo :field => "accounts.created_at", :direction => "DESC"
11
12
  end
12
13
  grid.columns do |columns|
13
14
  columns.fields @column_store.column_fields
@@ -1,17 +1,20 @@
1
1
  %html
2
2
  %head
3
3
  %title="#{AppConfig.project} v.#{Lipsiadmin::VERSION::STRING}"
4
- =stylesheet_link_tag :backend#_slate
4
+ =stylesheet_link_tag :backend
5
5
  %body
6
6
  #loading-mask
7
7
  #loading
8
8
  .loading-indicator
9
9
  =image_tag("backend/logo-loader.png") + "Loading..."
10
- // include everything after the loading indicator
10
+ / include everything after the loading indicator
11
11
  =javascript_include_tag :defaults, :backend
12
12
  -unless params[:small]
13
13
  #header
14
14
  #logo=link_to AppConfig.project, backend_path
15
15
  #logout=link_to "Logout #{current_account.email}", backend_session_path(1), :method => :delete
16
-
17
- %iframe{ :id => "ajax-iframe", :name => "ajax-iframe" }
16
+
17
+ %iframe{ :id => "ajax-iframe", :name => "ajax-iframe" }
18
+ %form{ :id => "history-form", :class => "x-hidden" }
19
+ =hidden_field_tag "x-history-field"
20
+ %iframe{ :id => "x-history-frame" }
@@ -4,26 +4,65 @@
4
4
  //
5
5
  Ext.BLANK_IMAGE_URL = '/images/ext/default/s.gif';
6
6
  Ext.namespace('Backend');
7
+ Ext.namespace('Backend.util.Format');
7
8
 
8
- Ext.Updater.defaults.loadScripts = true;
9
+ Ext.Updater.defaults.loadScripts = false;
9
10
  Ext.Updater.defaults.showLoadIndicator = false;
11
+ Ext.Updater.defaults.disableCaching = true;
10
12
 
13
+ // How it works?
14
+ //
15
+ // Basically we can load (async) contents in 3 ways:
16
+ //
17
+ // * Loading a file .js (javascript)
18
+ // * Loading a file .html (without extension are considered html)
19
+ // * Updating directly the html of the page
20
+ //
21
+ // If we load a directly a js we put them a <script src="youfile.js" type="text/javascript" /> in the <head>
22
+ // Consider that the head contains ONLY dynamic javascripts because the system one wose loaded after the loader mask in the <body>.
23
+ // We turn of Ext.Updater.defaults.loadScripts because we need to clean the cache (when required).
24
+ //
25
+ // So when we load a content we need to do two thing:
26
+ //
27
+ // * Clean the old html (loaded in the past ajax request)
28
+ // * Clean the old <script> tags (loaded in the past ajax request)
29
+ //
30
+ // For do that we use this functions: clean, cleanScripts.
31
+ //
32
+ // If we load direclty an html page we use an handler: this.contentDynamic.getUpdater().on('beforeupdate', function(){ this.cleanScripts(); this.clean(); }, this);
33
+ // If we update directly the html (ex a render :action => :some): update : function(html){ this.cleanScripts(); this.clean(); ... }
34
+ // If we load direclty a js file (ex a grid): load : function(url, cache){ ... if (clean) { this.cleanScripts(); this.clean(); } ... }
35
+ //
11
36
  Backend.app = function(){
37
+ // Our pretty simple cache
38
+ var cache = {};
39
+ var oldUrl = undefined;
12
40
  return {
41
+ // Init our app
13
42
  init : function(){
14
43
  Ext.state.Manager.setProvider(
15
44
  new Ext.state.CookieProvider({
16
- expires: new Date(new Date().getTime()+(1000*60*60*24*365)) //365 days
45
+ expires: new Date(new Date().getTime()+(1000*60*60*24*365))
17
46
  })
18
47
  );
48
+
19
49
  // We want save cookies only for grids
20
50
  Ext.override(Ext.Component, { stateful:false });
21
51
  Ext.override(Ext.grid.GridPanel, { stateful:true });
22
52
  Ext.QuickTips.init();
23
-
24
- Backend.cache.clear();
53
+
25
54
  // Used for direclty load some specific page
26
- var loadUrl = window.location.search ? Ext.urlDecode(window.location.search.substring(1)).load : undefined;
55
+ if (window.location.search){
56
+ var loadUrl = Ext.urlDecode(window.location.search.substring(1)).load;
57
+ } else if (window.location.href.split('#')[1]) {
58
+ var loadUrl = window.location.href.split('#')[1];
59
+ }
60
+
61
+ // Used for history the browsing
62
+ Ext.History.init();
63
+ Ext.History.on('change', function(token){ if(token != Backend.app.oldUrl) { Backend.app.load(token) } });
64
+
65
+ this.cache = {};
27
66
 
28
67
  if (!this.smallView()){
29
68
  var header = new Ext.Panel({
@@ -31,7 +70,7 @@ Backend.app = function(){
31
70
  region:'north',
32
71
  border: false,
33
72
  height: 65,
34
- bbar: new Ext.Toolbar({ cls:'x-toolbar-menu', items: [<%= backend_menu %>] })
73
+ bbar: <%= backend_menu %>
35
74
  });
36
75
  }
37
76
 
@@ -40,7 +79,7 @@ Backend.app = function(){
40
79
  region:'center',
41
80
  border:false,
42
81
  bodyStyle: 'background: #FFF url(/images/backend/bg-content.png) repeat-x top;',
43
- title:'&nbsp;',
82
+ title: this.title() ? '&nbsp;' : '',
44
83
  layout:'fit'
45
84
  });
46
85
 
@@ -49,7 +88,7 @@ Backend.app = function(){
49
88
  items: header ? [header, this.contentDynamic] : [this.contentDynamic]
50
89
  });
51
90
 
52
- this.contentDynamic.getUpdater().on('beforeupdate', function(){ this.clean(); }, this);
91
+ this.contentDynamic.getUpdater().on('beforeupdate', function(){ this.cleanScripts(); this.clean(); }, this);
53
92
  this.contentDynamic.getUpdater().on('update', this.inspectContent, this);
54
93
  this.load(loadUrl ? loadUrl : '/backend/base/welcome');
55
94
  setTimeout(function(){
@@ -60,60 +99,67 @@ Backend.app = function(){
60
99
 
61
100
  smallView : function(){
62
101
  return window.location.search ? Ext.urlDecode(window.location.search.substring(1)).small : false;
63
- }, // small
102
+ }, // smalloallProductsGroupingStore
64
103
 
65
104
  toolbar: function(){
66
- return window.location.search ? Ext.urlDecode(window.location.search.substring(1)).toolbar : false;
105
+ return window.location.search ? Ext.urlDecode(window.location.search.substring(1)).toolbar!="0" : true;
67
106
  }, // hideToolbar
68
107
 
69
- load : function(url, cache){
70
- var ext = (/[.]/.exec(url)) ? /[^.]+$/.exec(url) : 'html';
71
- var cache = (cache && cache == true) || false;
72
-
73
- if (!cache){ Backend.cache.clear(); }
108
+ title: function(){
109
+ return window.location.search ? Ext.urlDecode(window.location.search.substring(1)).title!="0" : true;
110
+ }, // hideTite
111
+
112
+ load : function(url){
113
+ var ext = (/[.]/.exec(url)) ? /[^.]+$/.exec(url) : 'html';
74
114
 
115
+ // Now we need to store the url in the history
116
+ if (!this.smallView()){
117
+ Ext.History.add(url, true);
118
+ this.oldUrl = url;
119
+ }
120
+ // Now give a reply based on request
75
121
  if (ext.length == 1 && ext[0].toLowerCase() == 'js') {
76
- // Clean the cache
122
+ // Clean the html and scripts if requested
123
+ this.cleanScripts();
77
124
  this.clean();
78
- // Store the js
79
- this.backTo = url;
80
- // Need to use this, because is not possible to disable evalJs through Ext.Ajax.request!
81
- new Ajax.Request(url, {
82
- method: 'GET',
83
- evalJS: false, // Need to disable for debug it
84
- onComplete: function(response){
85
- try { window.eval(response.responseText); } catch(e) { Backend.app.error(e); }
86
- }
87
- });
125
+ // We append the js into the head so we can easy inspect errors
126
+ var hd = document.getElementsByTagName("head")[0];
127
+ var s = document.createElement("script");
128
+ s.src = url;
129
+ s.type = 'text/javascript';
130
+ // Now we can append the child.
131
+ hd.appendChild(s);
88
132
  } else if (ext == 'html'){
89
- this.contentDynamic.getUpdater().update({ url: url, scripts: false, headers: { 'Accept': 'text/html, text/javascript, application/xml, text/xml, */*' } });
133
+ this.contentDynamic.getUpdater().update({ url: url, headers: { 'Accept': 'text/html, text/javascript, application/xml, text/xml, */*' } });
90
134
  } else {
91
135
  Ext.Msg.alert(Backend.locale.messages.alert.title, Backend.locale.messages.alert.message);
92
136
  }
93
- this.contentDynamic.addEvents('inspection');
94
137
  }, // load
95
138
 
96
139
  back: function(){
97
- if (Backend.app.backTo){
98
- Backend.app.load(Backend.app.backTo);
140
+ if (Backend.app.smallView()){
141
+ window.location.reload(true);
99
142
  } else {
100
- Ext.Msg.alert(Backend.locale.messages.alert.title, Backend.locale.messages.alert.notConfigured);
143
+ Ext.History.back();
101
144
  }
102
145
  },// back
103
146
 
104
- backTo: undefined, // lastJs
105
-
106
147
  update : function(html){
148
+ this.cleanScripts();
107
149
  this.clean();
108
150
  var el = this.contentDynamic.body.update(html, true);
109
151
  this.inspectContent(el);
110
152
  }, // update
111
153
 
154
+ cleanScripts: function(){
155
+ Ext.select('head > script').each(function(el){ el.remove(); });
156
+ }, // cleanScripts
157
+
112
158
  clean : function(){
113
159
  this.mask();
114
- this.contentDynamic.body.update('');
115
160
  this.contentDynamic.items.each(function(i){ i.destroy(); });
116
161
  this.contentDynamic.removeAll(true);
162
+ this.contentDynamic.body.update(''); // Another check ;)
117
163
  this.contentDynamic.doLayout();
118
164
  }, // clean
119
165
 
@@ -125,13 +171,9 @@ Backend.app = function(){
125
171
  submitForm : function(){
126
172
  Backend.app.mask(Backend.locale.messages.wait.message);
127
173
  Backend.app.contentDynamic.findByType('tabpanel').each(function(tabpanel){
128
- Backend.cache.set('active-tab', tabpanel.activeTab.id);
129
- });
130
- Ext.select('form').each(function(form){
131
- if (form.id != 'ajax-iframe'){
132
- form.dom.submit();
133
- }
174
+ cache.activeTab = tabpanel.activeTab.id;
134
175
  });
176
+ Ext.select('form[target=ajax-iframe]').each(function(form){ form.dom.submit(); });
135
177
  }, // submitForms
136
178
 
137
179
  setTitle: function(title){
@@ -139,96 +181,106 @@ Backend.app = function(){
139
181
  }, // SetTitle
140
182
 
141
183
  inspectContent: function(el, oResponseObject){
142
- // Search for forms (except ajax-frame) in the page, usually only one.
143
- el.select('form').each(function(form){
144
- if (form.id != 'ajax-iframe'){
145
- form.dom.target = 'ajax-iframe';
146
- }
147
- });
184
+ try {
185
+
186
+ // Search for forms (except ajax-frame) in the page, usually only one.
187
+ el.select('form').each(function(form){
188
+ if (form.id != 'ajax-iframe'){
189
+ form.dom.target = 'ajax-iframe';
190
+ }
191
+ });
148
192
 
149
- // Search for tabs in the page
150
- var tabs = el.select('div[tabbed=true]');
193
+ // Search for tabs in the page
194
+ var tabs = el.select('div[tabbed=true]');
151
195
 
152
- if (tabs.elements.length > 0){
153
- // Build Tabs
154
- var items = tabs.elements.collect(function(tab){
155
- var editable = tab.getAttribute('htmleditor');
156
- if (editable) {
157
- return { id: tab.id, autoScroll:false, title: tab.title, items: { xtype: 'htmleditor', id: editable, enableFont: false, value: tab.getAttribute('value') } };
158
- } else {
196
+ if (tabs.elements.length > 0){
197
+ // Build Tabs
198
+ var items = tabs.elements.collect(function(tab){
159
199
  return { id: tab.id, contentEl: tab.id, title: tab.title };
200
+ });
201
+
202
+ // Get ActiveTab
203
+ var activeTab = (cache.activeTab || 0);
204
+
205
+ var form = el.select('form[target=ajax-iframe]').first();
206
+
207
+ this.tabPanel = new Ext.TabPanel({
208
+ applyTo: form,
209
+ xtype:'tabpanel',
210
+ activeTab: activeTab,
211
+ border:false,
212
+ items: items,
213
+ deferredRender: true,
214
+ layoutOnTabChange: true,
215
+ enableTabScroll: true,
216
+ defaults: { autoScroll:true, layout:'fit' }
217
+ });
218
+
219
+ // We need to add an extra container for maximize compatibility with
220
+ // lastest safari builds.
221
+ var panelConfig = {
222
+ border:false,
223
+ layout:'fit',
224
+ items: this.tabPanel
225
+ };
226
+
227
+ if (this.toolbar()){
228
+ Ext.apply(panelConfig, {
229
+ bbar: [{
230
+ text: Backend.locale.buttons.back,
231
+ cls: 'x-btn-text-icon back',
232
+ handler: Backend.app.back
233
+ }, '->',{
234
+ text: Backend.locale.buttons.save,
235
+ cls: 'x-btn-text-icon save',
236
+ handler: Backend.app.submitForm
237
+ }]
238
+ });
160
239
  }
161
- });
162
240
 
163
- // Get ActiveTab
164
- var activeTab = (Backend.cache.get('active-tab') || 0);
165
-
166
- // Get The container, this code is redundant, but is a trick for ie.
167
- var container = Ext.get(tabs.elements[0].id).parent().id;
168
-
169
- var tabConfig = {
170
- applyTo: container,
171
- layoutOnTabChange:true,
172
- activeTab: activeTab,
173
- border:false,
174
- region:'center',
175
- items: items,
176
- defaults: { autoScroll:true, layout:'fit' }
241
+ // Build the Container
242
+ var panel = new Ext.Panel(panelConfig);
243
+ this.addItem(panel);
244
+
245
+ // Need to use this because some times we add tabs from inline scripts
246
+ this.tabPanel.on('add', function(container, tab){ if (tab.id == activeTab) { Backend.app.tabPanel.setActiveTab(activeTab); } });
177
247
  }
178
248
 
179
- if (this.toolbar()!="1"){
180
- Ext.apply(tabConfig, {
181
- bbar: [{
182
- text: Backend.locale.buttons.back,
183
- cls: 'x-btn-text-icon back',
184
- handler: Backend.app.back
185
- }, '->',{
186
- text: Backend.locale.buttons.save,
187
- cls: 'x-btn-text-icon save',
188
- handler: Backend.app.submitForm
189
- }]
190
- });
191
- }
249
+ // Now we can load scripts an eval scripts
250
+ var html = el.dom.innerHTML;
251
+ var dom = this.contentDynamic.body.dom;
192
252
 
193
- // Build TabPanel
194
- var tabPanel = new Ext.TabPanel(tabConfig);
195
- this.addItem(tabPanel);
196
- // Need to use this because some times we add tabs from inline scripts
197
- tabPanel.on('add', function(){ tabPanel.setActiveTab(activeTab) });
198
- }
199
-
200
- // Now we can load scripts
201
- var html = el.dom.innerHTML;
202
- var id = Ext.id();
203
- var dom = this.contentDynamic.body.dom;
204
-
205
- var hd = document.getElementsByTagName("head")[0];
206
- var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
207
- var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
208
- var typeRe = /\stype=([\'\"])(.*?)\1/i;
253
+ var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
254
+ var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
255
+ var typeRe = /\stype=([\'\"])(.*?)\1/i;
209
256
 
210
- var match;
211
- while(match = re.exec(html)){
212
- var attrs = match[1];
213
- var srcMatch = attrs ? attrs.match(srcRe) : false;
214
- if(srcMatch && srcMatch[2]){
215
- var s = document.createElement("script");
216
- s.src = srcMatch[2];
217
- var typeMatch = attrs.match(typeRe);
218
- if(typeMatch && typeMatch[2]){
219
- s.type = typeMatch[2];
220
- }
221
- hd.appendChild(s);
222
- }else if(match[2] && match[2].length > 0){
223
- if(window.execScript) {
224
- window.execScript(match[2]);
225
- } else {
226
- window.eval(match[2]);
257
+ var match;
258
+ while(match = re.exec(html)){
259
+ var attrs = match[1];
260
+ var srcMatch = attrs ? attrs.match(srcRe) : false;
261
+ if(srcMatch && srcMatch[2]){
262
+ // We append the js into the head so we can easy inspect errors
263
+ var hd = document.getElementsByTagName("head")[0];
264
+ var s = document.createElement("script");
265
+ s.src = srcMatch[2];
266
+ s.type = 'text/javascript';
267
+ // Now we can append the child.
268
+ hd.appendChild(s);
269
+ }else if(match[2] && match[2].length > 0){
270
+ if(window.execScript) {
271
+ window.execScript(match[2]);
272
+ } else {
273
+ window.eval(match[2]);
274
+ }
227
275
  }
228
276
  }
277
+
278
+ this.unmask();
279
+ // Empty our cache
280
+ cache = {};
281
+ } catch(e){
282
+ throw this.error(e)
229
283
  }
230
-
231
- this.unmask();
232
284
  },//inspectContent
233
285
 
234
286
  error: function(e){
@@ -244,12 +296,12 @@ Backend.app = function(){
244
296
  baseCls: 'x-plain',
245
297
  labelAlign: 'top',
246
298
  items: [{
247
- xtype:'textarea',
248
- anchor: '100% 100%',
249
- allowBlank: false,
250
- fieldLabel: Backend.locale.help.description,
251
- name: 'message'
252
- }]
299
+ xtype:'textarea',
300
+ anchor: '100% 100%',
301
+ allowBlank: false,
302
+ fieldLabel: Backend.locale.help.description,
303
+ name: 'message'
304
+ }]
253
305
  });
254
306
 
255
307
  var formDialog = new Ext.Window({
@@ -348,7 +400,7 @@ Backend.window = Ext.extend(Ext.Window, {
348
400
  handler: this.saveForm.createDelegate(this, [])}
349
401
  );
350
402
  }
351
- this.html = '<iframe id="'+this.iframeId+'" src="/backend/base/?small=1&toolbar='+(this.form?1:0)+'&load='+this.url+'" frameBorder="0" width="100%" height="100%" />';
403
+ this.html = '<iframe id="'+this.iframeId+'" class="windowed" src="/backend/base/?small=1&toolbar='+(this.form?0:1)+'&load='+this.url+'" frameBorder="0" width="100%" height="100%" />';
352
404
  }, // initComponent
353
405
 
354
406
  afterShow : function(afterShow){
@@ -375,23 +427,31 @@ Backend.window = Ext.extend(Ext.Window, {
375
427
  } // saveForm
376
428
  });
377
429
 
378
- Backend.cache = function(){
379
- return {
380
- get: function(key){
381
- return Ext.state.Manager.get('backend-cache') ? Ext.state.Manager.get('backend-cache')[key] : undefined;
382
- },// get
383
-
384
- set: function(key, value){
385
- config = {};
386
- config[key] = value;
387
- Ext.state.Manager.set('backend-cache', config);
388
- return config;
389
- }, // set
390
-
391
- clear: function(){
392
- Ext.state.Manager.clear('backend-cache');
393
- } // clear
394
- }// return
395
- }();
430
+ Backend.comboBox = Ext.extend(Ext.form.ComboBox, {
431
+ displayField:'title',
432
+ typeAhead: false,
433
+ loadingText: 'Searching...',
434
+ pageSize: 10,
435
+ autoWidth:true,
436
+ hideTrigger:true,
437
+ itemSelector: 'div.search-item',
438
+ initComponent : function(){
439
+ Backend.comboBox.superclass.initComponent.call(this);
440
+ if (this.autoWidth){
441
+ Backend.app.contentDynamic.on('resize', this.fitContent, this);
442
+ this.on('render', this.fitContent, this);
443
+ }
444
+ }, // initComponent
445
+ fitContent : function() {
446
+ this.el.setStyle({display:'none'});
447
+ var size = this.el.parent().parent().getSize();
448
+ this.onResize(size.width, size.height);
449
+ this.el.setStyle({display:'inline'});
450
+ }
451
+ });
452
+
453
+ Backend.showAlert = function(){
454
+ Ext.Msg.alert(Backend.locale.messages.alert.title, Backend.locale.messages.alert.message);
455
+ }
396
456
 
397
457
  Ext.onReady(Backend.app.init, Backend.app, true);