spreefinery_themes 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/app/assets/images/jstree/file.png +0 -0
  2. data/app/assets/images/jstree/folder.png +0 -0
  3. data/app/assets/javascripts/code_mirror_manager.coffee +105 -0
  4. data/app/assets/javascripts/editor.coffee +3 -0
  5. data/app/assets/javascripts/files_manager.coffee +41 -0
  6. data/app/assets/javascripts/jstree_manager.coffee +177 -0
  7. data/app/assets/javascripts/themes.coffee +21 -0
  8. data/app/assets/stylesheets/editor.css +40 -0
  9. data/app/assets/stylesheets/themes.css +50 -0
  10. data/app/controllers/refinery/themes/admin/editor_controller.rb +73 -0
  11. data/app/controllers/refinery/themes/admin/themes_controller.rb +60 -0
  12. data/app/controllers/refinery/themes/theme_controller.rb +12 -0
  13. data/app/decorators/action_view_decorator.rb +6 -0
  14. data/app/decorators/application_controller_decorator.rb +7 -0
  15. data/app/decorators/base_controller_decorator.rb +4 -0
  16. data/app/decorators/drops_decorator.rb +33 -0
  17. data/app/decorators/liquid_strainer_decorator.rb +23 -0
  18. data/app/decorators/refinery_admin_pages_controller_decorator.rb +6 -0
  19. data/app/decorators/refinery_pages_controller_decorator.rb +17 -0
  20. data/app/decorators/refinery_sessions_controller_decorator.rb +3 -0
  21. data/app/decorators/spree_base_controller_decorator.rb +3 -0
  22. data/app/decorators/spree_checkout_controller_decorator.rb +42 -0
  23. data/app/decorators/template_renderer_decorator.rb +25 -0
  24. data/app/helpers/refinery/themes/admin/themes_helper.rb +9 -0
  25. data/app/liquid/blocks/capture_variable.rb +36 -0
  26. data/app/liquid/blocks/content_for.rb +55 -0
  27. data/app/liquid/blocks/rss.rb +27 -0
  28. data/app/liquid/blocks/with_scope.rb +55 -0
  29. data/app/liquid/drops/address_drop.rb +5 -0
  30. data/app/liquid/drops/country_drop.rb +5 -0
  31. data/app/liquid/drops/form_builder_drop.rb +15 -0
  32. data/app/liquid/drops/image_drop.rb +5 -0
  33. data/app/liquid/drops/line_item_drop.rb +41 -0
  34. data/app/liquid/drops/menu_item_drop.rb +17 -0
  35. data/app/liquid/drops/option_type_drop.rb +5 -0
  36. data/app/liquid/drops/option_value_drop.rb +3 -0
  37. data/app/liquid/drops/order_drop.rb +19 -0
  38. data/app/liquid/drops/page_drop.rb +5 -0
  39. data/app/liquid/drops/page_part_drop.rb +18 -0
  40. data/app/liquid/drops/post_category_drop.rb +5 -0
  41. data/app/liquid/drops/post_comment_drop.rb +5 -0
  42. data/app/liquid/drops/post_drop.rb +21 -0
  43. data/app/liquid/drops/product_drop.rb +81 -0
  44. data/app/liquid/drops/product_property_drop.rb +5 -0
  45. data/app/liquid/drops/property_drop.rb +5 -0
  46. data/app/liquid/drops/role_drop.rb +5 -0
  47. data/app/liquid/drops/spree_money_drop.rb +10 -0
  48. data/app/liquid/drops/state_drop.rb +6 -0
  49. data/app/liquid/drops/taxon_drop.rb +24 -0
  50. data/app/liquid/drops/taxonomy_drop.rb +6 -0
  51. data/app/liquid/drops/user_drop.rb +22 -0
  52. data/app/liquid/drops/variant_drop.rb +24 -0
  53. data/app/liquid/filters/filters.rb +128 -0
  54. data/app/liquid/filters/protected.rb +28 -0
  55. data/app/liquid/filters/rails_filters.rb +73 -0
  56. data/app/liquid/tags/rails_tags.rb +63 -0
  57. data/app/liquid/tags/refinery_tags.rb +33 -0
  58. data/app/liquid/tags/spree_tags.rb +164 -0
  59. data/app/models/file_manager.rb +206 -0
  60. data/app/models/refinery/themes/theme.rb +79 -0
  61. data/app/views/refinery/admin/_dialog_success.html.erb +5 -0
  62. data/app/views/refinery/shared/_menu_branch.html.erb +30 -0
  63. data/app/views/refinery/shared/_pages_menu.html.erb +14 -0
  64. data/app/views/refinery/themes/admin/editor/_editor_actions.html.erb +9 -0
  65. data/app/views/refinery/themes/admin/editor/file.html.erb +50 -0
  66. data/app/views/refinery/themes/admin/editor/index.html.erb +15 -0
  67. data/app/views/refinery/themes/admin/editor/upload_file.html.erb +16 -0
  68. data/app/views/refinery/themes/admin/shared/_actions.html.erb +19 -0
  69. data/app/views/refinery/themes/admin/shared/_theme_assets.html.erb +6 -0
  70. data/app/views/refinery/themes/admin/themes/index.html.erb +58 -0
  71. data/app/views/refinery/themes/admin/themes/upload.html.erb +17 -0
  72. data/app/views/spree/products/_variants.html.erb +19 -0
  73. data/config/initializers/liquid_engine.rb +8 -0
  74. data/config/initializers/refinery/core.rb +4 -0
  75. data/config/initializers/refinery/pages.rb +9 -0
  76. data/config/locales/en.yml +14 -0
  77. data/config/routes.rb +42 -0
  78. data/lib/action_view/template/handlers/liquid.rb +88 -0
  79. data/lib/editable.rb +26 -0
  80. data/lib/hash.rb +5 -0
  81. data/lib/liquid/base_drop.rb +62 -0
  82. data/lib/spreefinery/engine.rb +46 -0
  83. data/lib/spreefinery_themes.rb +21 -0
  84. data/readme.md +27 -0
  85. metadata +178 -0
@@ -0,0 +1,105 @@
1
+ #= require codemirror/codemirror
2
+ #= require codemirror/util/simple-hint
3
+ #= require codemirror/util/dialog
4
+ #= require codemirror/util/searchcursor
5
+ #= require codemirror/util/search
6
+ #= require codemirror/util/javascript-hint
7
+ #= require codemirror/util/overlay
8
+ #= require codemirror/util/formatting
9
+ #= require codemirror/util/closetag
10
+ #= require codemirror/mode/css/css
11
+ #= require codemirror/mode/xml/xml
12
+ #= require codemirror/mode/liquid/liquid
13
+ #= require codemirror/mode/javascript/javascript
14
+ #= require codemirror/mode/yaml/yaml
15
+ #= require codemirror/mode/htmlmixed/htmlmixed
16
+ #= require codemirror/mode/htmlembedded/htmlembedded
17
+ # require codemirror/mode/scheme/scheme
18
+
19
+ #= require_self
20
+
21
+ class @CodeMirrorManager
22
+ constructor: (@text_area_id, @mode) ->
23
+ @editor = CodeMirror.fromTextArea(document.getElementById(@text_area_id),
24
+ lineNumbers: true
25
+ extraKeys:
26
+ F11: (cm) ->
27
+ setFullScreen cm, not isFullScreen(cm)
28
+ Esc: (cm) ->
29
+ setFullScreen cm, false if isFullScreen(cm)
30
+ "Ctrl-Space": "autocomplete"
31
+ mode: @mode
32
+ tabMode: "indent"
33
+ autoCloseTags: true
34
+ )
35
+ #@editor.on "change", =>
36
+ #$('#file_content').val(CodeMirrorManager.editor.getValue())
37
+ #clearTimeout delay
38
+ #delay = setTimeout(@updatePreview, 300)
39
+
40
+ #setTimeout @updatePreview, 300
41
+
42
+ CodeMirror.commands.autocomplete = (cm) ->
43
+ CodeMirror.simpleHint cm, CodeMirror.javascriptHint
44
+
45
+ CodeMirror.on window, "resize", ->
46
+ showing = document.body.getElementsByClassName("CodeMirror-fullscreen")[0]
47
+ return unless showing
48
+ showing.CodeMirror.getWrapperElement().style.height = winHeight() + "px"
49
+
50
+ CodeMirrorManager.editor = @editor
51
+
52
+
53
+ #TODO auto-detect the language
54
+ # function looksLikeScheme(code) {
55
+ # return !/^\s*\(\s*function\b/.test(code) && /^\s*[;\(]/.test(code);
56
+ # }
57
+ updatePreview: =>
58
+ #TODO auto-detect the language
59
+ # @editor.setOption("mode", looksLikeScheme(@editor.getValue()) ? "scheme" : "javascript");
60
+ previewFrame = document.getElementById('preview')
61
+ preview = previewFrame.contentDocument or previewFrame.contentWindow.document
62
+ preview.open()
63
+ preview.write @editor.getValue()
64
+ preview.close()
65
+
66
+ @selectTheme: ->
67
+ input = document.getElementById('select')
68
+ theme = input.options[input.selectedIndex].innerHTML
69
+ @editor.setOption "theme", theme
70
+ choice = document.location.search and decodeURIComponent(document.location.search.slice(1))
71
+ if choice
72
+ input.value = choice
73
+ @editor.setOption "theme", choice
74
+
75
+ @getSelectedRange: ->
76
+ from: @editor.getCursor(true)
77
+ to: @editor.getCursor(false)
78
+
79
+ @autoFormatSelection: ->
80
+ range = @getSelectedRange()
81
+ @editor.autoFormatRange range.from, range.to
82
+
83
+ @commentSelection: (isComment) ->
84
+ range = @getSelectedRange()
85
+ @editor.commentRange isComment, range.from, range.to
86
+
87
+ isFullScreen: (cm) ->
88
+ /\bCodeMirror-fullscreen\b/.test cm.getWrapperElement().className
89
+
90
+ winHeight: ->
91
+ window.innerHeight or (document.documentElement or document.body).clientHeight
92
+
93
+ @setFullScreen: (cm, full) ->
94
+ wrap = cm.getWrapperElement()
95
+ if full
96
+ wrap.className += " CodeMirror-fullscreen"
97
+ wrap.style.height = winHeight() + "px"
98
+ document.documentElement.style.overflow = "hidden"
99
+ else
100
+ wrap.className = wrap.className.replace(" CodeMirror-fullscreen", "")
101
+ wrap.style.height = ""
102
+ document.documentElement.style.overflow = ""
103
+ cm.refresh()
104
+
105
+
@@ -0,0 +1,3 @@
1
+ $ ->
2
+ jstreeManager = new JstreeManager()
3
+ filesManager = new FilesManager()
@@ -0,0 +1,41 @@
1
+ class @FilesManager
2
+ constructor: ->
3
+ $(".mmenu input").click ->
4
+ switch @id
5
+ when "add_default", "add_folder"
6
+ $("#jsTree").jstree "create", null, "last",
7
+ attr:
8
+ rel: @id.toString().replace("add_", "")
9
+ when "search"
10
+ $("#jsTree").jstree "search", document.getElementById("text").value
11
+ when "refresh"
12
+ $("#code").html('')
13
+ $('#jsTree').jstree('refresh',-1);
14
+ else
15
+ $("#jsTree").jstree @id
16
+
17
+ @initHandlers = ->
18
+ $("#file_submit").click ->
19
+ $("#form_for_file").submit()
20
+
21
+ $("#form_for_file").submit ->
22
+ $('#file_content').val(CodeMirrorManager.editor.getValue())
23
+ FilesManager.saveFile()
24
+ false
25
+
26
+
27
+ @saveFile = ->
28
+ $.ajax
29
+ url: "/refinery/themes/editor/save_file"
30
+ type: "POST"
31
+ beforeSend: (request) ->
32
+ $("#spinner").show()
33
+ $("#file_submit").hide()
34
+
35
+ data: $.param($("#form_for_file").serializeArray())
36
+ dataType: "html"
37
+ success: (D) ->
38
+ $("#code").html(D)
39
+ FilesManager.initHandlers()
40
+ $.jGrowl "File successfully saved!",
41
+ life: 5000
@@ -0,0 +1,177 @@
1
+ #= require jstree/jquery.jstree
2
+
3
+ class @JstreeManager
4
+ constructor: ->
5
+ @tree = $("#jsTree")
6
+ @buildTree()
7
+ @tree
8
+
9
+ uploadFile = (obj) ->
10
+ iframe = $("<iframe id='dialog_iframe' frameborder='0' marginheight='0' marginwidth='0' border='0'></iframe>")
11
+ iframe.corner "8px" unless $.browser.msie
12
+ iframe.dialog
13
+ title: "Upload New File"
14
+ modal: true
15
+ resizable: false
16
+ autoOpen: true
17
+ open: onOpenDialog
18
+ close: onCloseDialog
19
+ iframe.attr "src", "/refinery/themes/editor/upload_file?app_dialog=true&dialog=true&path="+obj.attr("fullpath")
20
+
21
+ buildTree: ->
22
+ @tree.jstree(
23
+ plugins: ["themes", "json_data", "ui", "crrm", "cookies", "dnd", "search", "types", "contextmenu"]
24
+ contextmenu:
25
+ items:
26
+ upload:
27
+ label: "Upload File"
28
+ action: (obj) -> uploadFile obj
29
+ _class: "upload_file"
30
+ create:
31
+ separator_before: false
32
+ separator_after: true
33
+ label: "Create"
34
+ action: false
35
+ submenu:
36
+ create_file:
37
+ seperator_before: false
38
+ seperator_after: false
39
+ label: "File"
40
+ action: (obj) -> this.create(obj, "last", {"attr" : {"rel" : "default"}})
41
+ create_folder:
42
+ seperator_before: false
43
+ seperator_after: false
44
+ label: "Folder"
45
+ action: (obj) -> this.create(obj, "last", {"attr" : { "rel" : "folder"}})
46
+ themes:
47
+ url: "/assets/jstree/themes/apple/style.css"
48
+ json_data:
49
+ ajax:
50
+ url: "/refinery/themes/editor/list"
51
+ type: "POST"
52
+ data: (n) ->
53
+ fullpath: (if n.attr then n.attr("fullpath") else "")
54
+ search:
55
+ ajax:
56
+ url: "/refinery/themes/editor/search"
57
+ data: (str) ->
58
+ search_str: str
59
+ types:
60
+ max_depth: -2
61
+ max_children: -2
62
+ valid_children: ["drive"]
63
+ types:
64
+ default:
65
+ valid_children: "none"
66
+ icon:
67
+ image: "/assets/jstree/file.png"
68
+ folder:
69
+ valid_children: ["default", "folder"]
70
+ icon:
71
+ image: "/assets/jstree/folder.png"
72
+ drive:
73
+ valid_children: ["default", "folder"]
74
+ icon:
75
+ image: "/assets/jstree/root.png"
76
+ start_drag: false
77
+ move_node: false
78
+ delete_node: false
79
+ remove: false
80
+ ).bind("select_node.jstree", (e, data) ->
81
+ if data.rslt.obj.attr("rel") is "default"
82
+ $.ajax
83
+ async: false
84
+ type: "POST"
85
+ url: "/refinery/themes/editor/file"
86
+ beforeSend: (request) ->
87
+ return true
88
+ data:
89
+ fullpath: data.rslt.obj.attr("fullpath")
90
+ success: (result) ->
91
+ if result
92
+ $("#code").html result
93
+ FilesManager.initHandlers()
94
+ $.jGrowl data.rslt.obj.attr("fullpath") + " was loaded.",
95
+ life: 5000
96
+ else
97
+ $.jGrowl result.notice,
98
+ life: 5000
99
+
100
+ ).bind("create.jstree", (e, data) ->
101
+ $.post "/refinery/themes/editor/add",
102
+ fullpath: data.rslt.parent.attr("fullpath")
103
+ title: data.rslt.name
104
+ type: data.rslt.obj.attr("rel"),
105
+ (result) ->
106
+ if result.status
107
+ $(data.rslt.obj).attr "fullpath", result.fullpath
108
+ $("#jsTree").jstree "rename_node", $(data.rslt.obj), result.node_name
109
+ $.jGrowl result.notice,
110
+ life: 5000
111
+ else
112
+ $.jstree.rollback data.rlbk
113
+ $.jGrowl result.notice,
114
+ life: 5000
115
+
116
+ ).bind("remove.jstree", (e, data) ->
117
+ if (confirm("Are you sure?"))
118
+ $.ajax
119
+ async: false
120
+ type: "POST"
121
+ url: "/refinery/themes/editor/delete"
122
+ data:
123
+ fullpath: data.rslt.obj.attr("fullpath")
124
+ type: data.rslt.obj.attr("rel")
125
+
126
+ success: (result) ->
127
+ if result.status
128
+ data.inst.refresh()
129
+ $.jGrowl result.notice,
130
+ life: 5000
131
+ else
132
+ $.jstree.rollback data.rlbk
133
+ $.jGrowl result.notice,
134
+ life: 5000
135
+ else
136
+ $.jstree.rollback data.rlbk
137
+
138
+ ).bind("rename.jstree", (e, data) ->
139
+ $.ajax
140
+ async: true
141
+ type: "POST"
142
+ url: "/refinery/themes/editor/rename"
143
+ data:
144
+ fullpath: data.rslt.obj.attr("fullpath")
145
+ new_name: data.rslt.new_name
146
+ type: data.rslt.obj.attr("rel")
147
+
148
+ success: (result) ->
149
+ if result.status
150
+ $(data.rslt.obj).attr "fullpath", result.fullpath
151
+ $("#jsTree").jstree "rename_node", $(data.rslt.obj), result.node_name
152
+ $.jGrowl result.notice,
153
+ life: 5000
154
+
155
+ else
156
+ $.jstree.rollback data.rlbk
157
+ $.jGrowl result.notice,
158
+ life: 5000
159
+
160
+ ).bind "move_node.jstree", (e, data) ->
161
+ data.rslt.o.each (i) ->
162
+ $.ajax
163
+ async: false
164
+ type: "POST"
165
+ url: "/refinery/themes/editor/move"
166
+ data:
167
+ fullpath: $(this).attr("fullpath")
168
+ ref: data.rslt.np.attr("fullpath")
169
+ title: data.rslt.name
170
+ copy: (if data.rslt.cy then 1 else 0)
171
+
172
+ success: (result) ->
173
+ unless result.status
174
+ $.jstree.rollback data.rlbk
175
+ else
176
+ $(data.rslt.oc).attr "fullpath", "node_" + result.fullpath
177
+ data.inst.refresh data.inst._get_parent(data.rslt.oc) if data.rslt.cy and $(data.rslt.oc).children("UL").length
@@ -0,0 +1,21 @@
1
+ #= require jquery.cookie
2
+ # require jquery.hotkeys
3
+ #= require jquery.jgrowl_minimized
4
+ #= require fancybox/jquery.fancybox
5
+ #= require jstree_manager
6
+ #= require files_manager
7
+ #= require code_mirror_manager
8
+ #= require_self
9
+
10
+ class @Themes
11
+ @resetToDefaultTheme = (url) ->
12
+ if (confirm("Are you sure?"))
13
+ window.location = url
14
+
15
+ $ ->
16
+ $(".fancybox").fancybox
17
+ openEffect: "elastic"
18
+ closeEffect: "elastic"
19
+ helpers:
20
+ title:
21
+ type: "inside"
@@ -0,0 +1,40 @@
1
+ #jsTree li a {
2
+ background: none;
3
+ border: none;
4
+ display: inline;
5
+ padding: 0;
6
+ }
7
+
8
+ #jsTree li {
9
+ margin-top: 0;
10
+ }
11
+
12
+ #jsTree ul {
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ iframe#preview {
18
+ width: 100%;
19
+ margin-top: 20px;
20
+ height: 400px;
21
+ }
22
+
23
+ .cm-liquid-tag {
24
+ color: #32273f;
25
+ background: #ead9ff;
26
+ }
27
+
28
+ .cm-liquid-variable {
29
+ color: #29739b;
30
+ background: #c2e0f0;
31
+ }
32
+
33
+ .CodeMirror-fullscreen {
34
+ display: block;
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ width: 100%;
39
+ z-index: 9999;
40
+ }
@@ -0,0 +1,50 @@
1
+ /*
2
+ *= require fancybox/jquery.fancybox
3
+ *= require jquery.jgrowl
4
+ *= require codemirror/codemirror
5
+ *= require codemirror/util/simple-hint
6
+ *= require codemirror/util/dialog.css
7
+ *= require codemirror/theme/neat
8
+ *= require codemirror/theme/elegant
9
+ *= require codemirror/theme/erlang-dark
10
+ *= require codemirror/theme/night
11
+ *= require codemirror/theme/monokai
12
+ *= require codemirror/theme/cobalt
13
+ *= require codemirror/theme/eclipse
14
+ *= require codemirror/theme/rubyblue
15
+ *= require codemirror/theme/lesser-dark
16
+ *= require codemirror/theme/xq-dark
17
+ *= require codemirror/theme/ambiance
18
+ *= require codemirror/theme/blackboard
19
+ *= require codemirror/theme/vibrant-ink
20
+ *= require codemirror/theme/solarized
21
+ *= require codemirror/theme/twilight
22
+ *= require_self
23
+ */
24
+
25
+ #records table tr td {
26
+ padding-top: 20px;
27
+ }
28
+
29
+ a.fancybox {
30
+ text-align: center;
31
+ border-bottom: none !important;
32
+ }
33
+
34
+ a.fancybox-close {
35
+ border-bottom: none !important;
36
+ }
37
+
38
+ .screenshot {
39
+ width: 100%;
40
+ }
41
+
42
+ .fullwidth {
43
+ width: 98%;
44
+ }
45
+
46
+ .theme-info {
47
+ display: inline-block;
48
+ vertical-align: top;
49
+ padding-left: 20px;
50
+ }