spreefinery_themes 1.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 (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
+ }