vinsol_spree_themes 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +36 -0
  3. data/.ruby-version +1 -0
  4. data/Appraisals +16 -0
  5. data/Gemfile +9 -0
  6. data/Gemfile.lock +386 -0
  7. data/LICENSE +26 -0
  8. data/README.md +250 -0
  9. data/Rakefile +21 -0
  10. data/app/assets/javascripts/spree/backend/codemirror/codemirror.js +9351 -0
  11. data/app/assets/javascripts/spree/backend/codemirror/css-hint.js +60 -0
  12. data/app/assets/javascripts/spree/backend/codemirror/fullscreen.js +41 -0
  13. data/app/assets/javascripts/spree/backend/codemirror/html-hint.js +348 -0
  14. data/app/assets/javascripts/spree/backend/codemirror/javascript-hint.js +155 -0
  15. data/app/assets/javascripts/spree/backend/codemirror/javascript.js +813 -0
  16. data/app/assets/javascripts/spree/backend/codemirror/markdown.js +796 -0
  17. data/app/assets/javascripts/spree/backend/codemirror/ruby.js +295 -0
  18. data/app/assets/javascripts/spree/backend/codemirror/show-hint.js +438 -0
  19. data/app/assets/javascripts/spree/backend/editor.js +11 -0
  20. data/app/assets/javascripts/spree/backend/jquery.treemenu.js +87 -0
  21. data/app/assets/javascripts/spree/backend/main.js +26 -0
  22. data/app/assets/javascripts/spree/backend/spree_themes.js +2 -0
  23. data/app/assets/javascripts/spree/backend/template.js +51 -0
  24. data/app/assets/javascripts/spree/backend/theme.js +17 -0
  25. data/app/assets/javascripts/spree/frontend/spree_themes.js +2 -0
  26. data/app/assets/stylesheets/spree/backend/codemirror/codemirror.css +340 -0
  27. data/app/assets/stylesheets/spree/backend/codemirror/fullscreen.css +6 -0
  28. data/app/assets/stylesheets/spree/backend/codemirror/show-hint.css +36 -0
  29. data/app/assets/stylesheets/spree/backend/editor.css +7 -0
  30. data/app/assets/stylesheets/spree/backend/jquery.treemenu.css +8 -0
  31. data/app/assets/stylesheets/spree/backend/spree_themes.css +7 -0
  32. data/app/assets/stylesheets/spree/backend/style.css +239 -0
  33. data/app/assets/stylesheets/spree/backend/template_editor.css +39 -0
  34. data/app/assets/stylesheets/spree/frontend/spree_themes.css +6 -0
  35. data/app/assets/stylesheets/spree/frontend/theme_preview.css +9 -0
  36. data/app/controllers/spree/admin/themes_controller.rb +80 -0
  37. data/app/controllers/spree/admin/themes_preview_controller.rb +30 -0
  38. data/app/controllers/spree/admin/themes_templates_controller.rb +60 -0
  39. data/app/controllers/spree/fragment_cache_controller.rb +13 -0
  40. data/app/controllers/spree/store_controller_decorator.rb +37 -0
  41. data/app/helpers/spree/base_helper_decorator.rb +45 -0
  42. data/app/models/spree/theme.rb +153 -0
  43. data/app/models/spree/themes_template.rb +67 -0
  44. data/app/models/spree/themes_template/cache_resolver.rb +37 -0
  45. data/app/overrides/spree/add_preview_bar_to_store.html.rb +6 -0
  46. data/app/overrides/spree/add_theme_meta_details_to_store.html.rb +6 -0
  47. data/app/overrides/spree/admin/add_themes_tab.html.rb +6 -0
  48. data/app/services/assets_precompiler_service.rb +86 -0
  49. data/app/services/file_generator_service.rb +29 -0
  50. data/app/services/template_generator_service.rb +101 -0
  51. data/app/services/zip_file_builder.rb +87 -0
  52. data/app/services/zip_file_extractor.rb +52 -0
  53. data/app/views/spree/admin/shared/_theme_menu_button.html.erb +5 -0
  54. data/app/views/spree/admin/themes/_themes.html.erb +44 -0
  55. data/app/views/spree/admin/themes/_upload.html.erb +17 -0
  56. data/app/views/spree/admin/themes/index.html.erb +50 -0
  57. data/app/views/spree/admin/themes_templates/_editor.html.erb +29 -0
  58. data/app/views/spree/admin/themes_templates/_template.html.erb +12 -0
  59. data/app/views/spree/admin/themes_templates/edit.html.erb +13 -0
  60. data/app/views/spree/admin/themes_templates/edit.js.erb +1 -0
  61. data/app/views/spree/admin/themes_templates/index.html.erb +27 -0
  62. data/app/views/spree/admin/themes_templates/new.html.erb +56 -0
  63. data/app/views/spree/shared/_preview_bar.html.erb +7 -0
  64. data/app/views/spree/shared/_theme_metadata.html.erb +9 -0
  65. data/bin/rails +7 -0
  66. data/config/initializers/assets.rb +24 -0
  67. data/config/initializers/sprockets.rb +85 -0
  68. data/config/locales/en.yml +52 -0
  69. data/config/routes.rb +22 -0
  70. data/db/migrate/20170628072452_vinsol_spree_themes_create_themes_and_themes_templates_table.rb +24 -0
  71. data/gemfiles/spree_3_1.gemfile +8 -0
  72. data/gemfiles/spree_3_2.gemfile +9 -0
  73. data/gemfiles/spree_master.gemfile +9 -0
  74. data/lib/generators/themes/default.zip +0 -0
  75. data/lib/generators/vinsol_spree_themes/install/install_generator.rb +50 -0
  76. data/lib/tasks/sync_templates.rake +47 -0
  77. data/lib/vinsol_spree_themes.rb +3 -0
  78. data/lib/vinsol_spree_themes/engine.rb +22 -0
  79. data/lib/vinsol_spree_themes/factories.rb +6 -0
  80. data/lib/vinsol_spree_themes/version.rb +18 -0
  81. data/spec/spec_helper.rb +93 -0
  82. data/vinsol_spree_themes.gemspec +43 -0
  83. metadata +374 -0
@@ -0,0 +1,6 @@
1
+ .CodeMirror-fullscreen {
2
+ position: fixed;
3
+ top: 0; left: 0; right: 0; bottom: 0;
4
+ height: auto;
5
+ z-index: 9;
6
+ }
@@ -0,0 +1,36 @@
1
+ .CodeMirror-hints {
2
+ position: absolute;
3
+ z-index: 10;
4
+ overflow: hidden;
5
+ list-style: none;
6
+
7
+ margin: 0;
8
+ padding: 2px;
9
+
10
+ -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
11
+ -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
12
+ box-shadow: 2px 3px 5px rgba(0,0,0,.2);
13
+ border-radius: 3px;
14
+ border: 1px solid silver;
15
+
16
+ background: white;
17
+ font-size: 90%;
18
+ font-family: monospace;
19
+
20
+ max-height: 20em;
21
+ overflow-y: auto;
22
+ }
23
+
24
+ .CodeMirror-hint {
25
+ margin: 0;
26
+ padding: 0 4px;
27
+ border-radius: 2px;
28
+ white-space: pre;
29
+ color: black;
30
+ cursor: pointer;
31
+ }
32
+
33
+ li.CodeMirror-hint-active {
34
+ background: #08f;
35
+ color: white;
36
+ }
@@ -0,0 +1,7 @@
1
+ /*
2
+ // manifest js file for initializing codemirror editor.
3
+
4
+ *= require 'spree/backend/codemirror/codemirror'
5
+ *= require 'spree/backend/codemirror/show-hint'
6
+ *= require 'spree/backend/codemirror/fullscreen'
7
+ */
@@ -0,0 +1,8 @@
1
+ /* For treemenu.js */
2
+ .treemenu li { list-style: none; }
3
+ .treemenu .toggler { cursor: pointer; }
4
+ .treemenu .toggler:before { display: inline-block; margin-right: 2pt; }
5
+ li.tree-empty > .toggler { opacity: 0.3; cursor: default; }
6
+ li.tree-empty > .toggler:before { content: "\2212"; }
7
+ li.tree-closed > .toggler:before { content: "+"; }
8
+ li.tree-opened > .toggler:before { content: "\2212"; }
@@ -0,0 +1,7 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/backend/all.css'
4
+
5
+ *= require 'spree/backend/style'
6
+ *= require 'spree/backend/template_editor'
7
+ */
@@ -0,0 +1,239 @@
1
+ a {
2
+ color: #235ccc;
3
+ }
4
+ .btn-success,
5
+ .btn.action-capture {
6
+ color: #fff;
7
+ background-color: #1e8a1d;
8
+ border-color: #1e8a1d;
9
+ }
10
+ #main-part {
11
+ padding: 15px 15px 0;
12
+ }
13
+
14
+ .theme-row {
15
+ position: relative;
16
+ }
17
+ .theme {
18
+ margin-bottom: 30px;
19
+ }
20
+
21
+ .theme-block {
22
+ background: #f9f9f9;
23
+ border: solid 1px #ddd;
24
+ position: relative;
25
+ cursor: pointer;
26
+ }
27
+ .theme-block:hover .thumbnail {
28
+ opacity: 0.3;
29
+ }
30
+ .theme .thumbnail {
31
+ margin-bottom: 0;
32
+ padding: 0;
33
+ border: none;
34
+ border-radius: 0;
35
+ transition: all 0.15s
36
+ }
37
+
38
+ .theme-image {
39
+ height: auto;
40
+ position: absolute;
41
+ left: 0;
42
+ top: 0;
43
+ width: 100%;
44
+ }
45
+ .theme-name-area {
46
+ position: relative;
47
+ }
48
+ .theme-name {
49
+ border-radius: 0;
50
+ border-top: solid 1px #ddd;
51
+ font-size:15px;
52
+ margin: 0;
53
+ overflow: hidden;
54
+ padding: 15px 60px 15px 15px;
55
+ text-overflow: ellipsis;
56
+ white-space: nowrap;
57
+ background: #f9f9f9;
58
+ }
59
+ .theme .btn-group {
60
+ bottom: 0;
61
+ font-size: 13px;
62
+ position: absolute;
63
+ right: 0;
64
+ top: 0;
65
+ border-left:solid 1px #ddd;
66
+ }
67
+ .theme .btn-group .dropdown-toggle {
68
+ border-radius: 0;
69
+ border: none;
70
+ background: none;
71
+ float: none;
72
+ color: rgba(0,0,0,0.5);
73
+ font-size: 22px;
74
+ line-height: 48px;
75
+ width: 60px;
76
+ padding: 0;
77
+ height: 47px;
78
+ transition: all 1s;
79
+ }
80
+ .theme .btn-group .dropdown-toggle:hover {
81
+ color: rgba(0,0,0,1);
82
+ }
83
+ .theme .btn-group.open .dropdown-toggle {
84
+ background: rgba(0,0,0,0.6);
85
+ color: #fff;
86
+ }
87
+ .more-action-glyphicon {
88
+ transition: all 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275);
89
+ margin-top: 2px;
90
+ }
91
+
92
+ .btn-group.open .more-action-glyphicon {
93
+ -webkit-transform: rotate(90deg);
94
+ transform: rotate(90deg);
95
+ }
96
+ .theme .btn-group .dropdown-menu {
97
+ margin-bottom: 0;
98
+ left: auto;
99
+ right: 0;
100
+ padding: 0
101
+ }
102
+ .theme-state .label {
103
+ border-radius: 2px;
104
+ font-size: inherit;
105
+ font-weight: normal;
106
+ padding: 5px 10px;
107
+ text-transform: uppercase;
108
+ vertical-align: middle;
109
+ }
110
+ .published .theme-block {
111
+ border-color: #6cb575;
112
+ }
113
+ .published .theme-name {
114
+ background: #6cb575;
115
+ border-color: #6cb575;
116
+ color: #fff;
117
+ padding-right: 110px;
118
+ }
119
+ .theme-name-link {
120
+ color: inherit;
121
+ }
122
+ .theme-name-link:hover {
123
+ text-decoration: none;
124
+ color: inherit;
125
+ }
126
+ .cmn-height-block:after {
127
+ content: ' ';
128
+ padding-top: 62%;
129
+ display: block;
130
+ }
131
+ .cmn-height-block.thumbnail .theme-image {
132
+ max-height: 228px;
133
+ overflow: hidden;
134
+ }
135
+ .theme-action-view {
136
+ position: absolute;
137
+ top: 50%;
138
+ left: 0;
139
+ right: 0;
140
+ transform: translateY(-40%);
141
+ text-align: center;
142
+ opacity: 0;
143
+ }
144
+ .theme-block:hover .theme-action-view {
145
+ transform: translateY(-50%) scale(1);
146
+ opacity: 1;
147
+ }
148
+ .updload-theme-panel label {
149
+ border: 5px dashed rgba(0,0,0,.1);
150
+ margin: 0;
151
+ width: 100%;
152
+ cursor: pointer;
153
+ position: relative;
154
+ transition: all 0.3s;
155
+ }
156
+ .file-visible-xs {
157
+ margin-bottom: 30px;
158
+ }
159
+ .updload-theme-panel label:after {
160
+ margin-bottom: 45px;
161
+ }
162
+ .updload-theme-panel label:hover {
163
+ background: #162e40;
164
+ color: #fff;
165
+ }
166
+ .updload-theme-panel input[type="file"] {
167
+ opacity: 0;
168
+ position: absolute;
169
+ height: 0;
170
+ width: 0;
171
+ font-size: 0.01em;
172
+ }
173
+ .updload-theme-panel .file-btn-helper {
174
+ font-size: 20px;
175
+ position: absolute;
176
+ top: 50%;
177
+ left: 0;
178
+ right: 0;
179
+ transform: translateY(-50%);
180
+ transition: all 0.3s;
181
+ }
182
+ .updload-theme-panel label:hover .file-btn-helper {
183
+ line-height: 2;
184
+ }
185
+ .updload-theme-panel .file-btn-helper .upload-icon {
186
+ font-size: 2em;
187
+ }
188
+
189
+ /*template search bar*/
190
+ .inner-addon {
191
+ position: relative;
192
+ }
193
+ .inner-addon .glyphicon {
194
+ padding: 10px;
195
+ pointer-events: none;
196
+ position: absolute;
197
+ }
198
+ .left-addon .glyphicon {
199
+ left: 0px;
200
+ }
201
+ .right-addon .glyphicon {
202
+ right: 0px;
203
+ }
204
+ .left-addon input {
205
+ padding-left: 30px;
206
+ }
207
+ .right-addon input {
208
+ padding-right: 30px;
209
+ }
210
+
211
+ .theme .dropdown-item {
212
+ display: block;
213
+ width: 100%;
214
+ padding: 10px;
215
+ clear: both;
216
+ font-weight: 400;
217
+ color: #292b2c;
218
+ text-align: inherit;
219
+ white-space: nowrap;
220
+ background: 0 0;
221
+ }
222
+ .theme .dropdown-item + .dropdown-item {
223
+ border-top: solid 1px #ddd;
224
+ }
225
+ .theme .dropdown-item:hover {
226
+ background: #f2f2f2;
227
+ text-decoration: none;
228
+ transition: all 0.3s;
229
+ }
230
+
231
+ .published .btn-group {
232
+ border-color: #5da066;
233
+ }
234
+ .published .btn-group .dropdown-toggle {
235
+ color: rgba(144, 251, 157, 0.7);
236
+ }
237
+ .published .btn-group .dropdown-toggle:hover {
238
+ color: #fff;
239
+ }
@@ -0,0 +1,39 @@
1
+ .admin-editor-section {
2
+ padding-bottom: 30px;
3
+ }
4
+ .admin-editor-section .CodeMirror {
5
+ max-width: 100%;
6
+ }
7
+ /* template filetree structure*/
8
+ .tree {
9
+ background-color: #f9f9f9;
10
+ margin: 0;
11
+ padding: 0;
12
+ }
13
+ .tree li, .tree li > a, .tree li > span {
14
+ padding: 4pt;
15
+ border-radius: 4px;
16
+ }
17
+ .tree li a {
18
+ color: inherit;
19
+ text-decoration: none;
20
+ line-height: 20pt;
21
+ border-radius: 4px;
22
+ }
23
+ .tree li a:hover {
24
+ background-color: #0079b3;
25
+ color: #fff;
26
+ }
27
+ .tree .active {
28
+ background-color: #f2f2f2;
29
+ }
30
+ .tree .active a:hover {
31
+ background-color: #0079b3;
32
+ }
33
+ .tree .treemenu {
34
+ padding: 0 0 0 10px;
35
+ }
36
+ .highlight-file-link {
37
+ background: #0079b3;
38
+ color: #fff !important;
39
+ }
@@ -0,0 +1,6 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/frontend/all.css'
4
+ */
5
+
6
+ @import 'theme_preview.css'
@@ -0,0 +1,9 @@
1
+ .alert-preview {
2
+ background: #5cb85c;
3
+ border-color: #5cb85c;
4
+ color: #fff;
5
+ margin-bottom: 0 !important;
6
+ }
7
+ .alert-preview [data-method="delete"] {
8
+ color: #fff;
9
+ }
@@ -0,0 +1,80 @@
1
+ module Spree
2
+ module Admin
3
+ class ThemesController < Spree::Admin::BaseController
4
+
5
+ before_action :load_theme, only: [:state_change, :destroy, :download]
6
+ before_action :load_themes
7
+
8
+ def index
9
+ @theme = Spree::Theme.new
10
+ end
11
+
12
+ def upload
13
+ @theme = Spree::Theme.new(theme_params)
14
+ if @theme.save
15
+ flash[:notice] = Spree.t('flash.admin.themes.upload.success', name: @theme.name)
16
+ redirect_to admin_themes_path
17
+ else
18
+ flash[:error] = Spree.t('flash.admin.themes.upload.failure', name: @theme.name)
19
+ render :index
20
+ end
21
+ end
22
+
23
+ def state_change
24
+ state = case params[:state]
25
+ when 'compiled' then @theme.compile
26
+ when 'published' then @theme.publish
27
+ else false
28
+ end
29
+ if state
30
+ flash[:notice] = Spree.t('flash.admin.themes.state_change.success', state: params[:state], name: @theme.name)
31
+ redirect_to admin_themes_path
32
+ else
33
+ flash[:error] = Spree.t('flash.admin.themes.state_change.failure', state: params[:state], name: @theme.name, errors: @theme.errors.full_messages.join(', '))
34
+ render :index
35
+ end
36
+ end
37
+
38
+ def download
39
+ begin
40
+ zipfile = ZipFileBuilder.new(@theme)
41
+ zipfile.archive
42
+ send_file(zipfile.output_path, disposition: 'attachment', filename: zipfile.name)
43
+ rescue Exception => e
44
+ flash[:error] = Spree.t('flash.admin.themes.download.failure', name: @theme.name, errors: e.message)
45
+ render :index
46
+ end
47
+ end
48
+
49
+ def destroy
50
+ if @theme.destroy
51
+ flash[:notice] = Spree.t('flash.admin.themes.destroy.success', name: @theme.name)
52
+ redirect_to admin_themes_path
53
+ else
54
+ flash[:error] = Spree.t('flash.admin.themes.destroy.failure', name: @theme.name, errors: @theme.errors.full_messages.join(', '))
55
+ render :index
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def theme_params
62
+ return {} unless params[:theme]
63
+ params.require(:theme).permit(:template_file)
64
+ end
65
+
66
+ def load_themes
67
+ @search = Spree::Theme.search(params[:q])
68
+ @themes = @search.result.order(:name).page(params[:page]).per(params[:per_page])
69
+ end
70
+
71
+ def load_theme
72
+ @theme = Spree::Theme.find_by(id: params[:id])
73
+ unless @theme
74
+ redirect_to admin_themes_path
75
+ end
76
+ end
77
+
78
+ end
79
+ end
80
+ end