monatomic 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +3 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +88 -0
  7. data/Rakefile +19 -0
  8. data/bin/console +11 -0
  9. data/bin/setup +7 -0
  10. data/examples/simple.rb +23 -0
  11. data/lib/monatomic.rb +14 -0
  12. data/lib/monatomic/application.rb +52 -0
  13. data/lib/monatomic/assets/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  14. data/lib/monatomic/assets/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
  15. data/lib/monatomic/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  16. data/lib/monatomic/assets/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  17. data/lib/monatomic/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  18. data/lib/monatomic/assets/javascripts/application.js.coffee +20 -0
  19. data/lib/monatomic/assets/javascripts/bootstrap-datepicker.js +1782 -0
  20. data/lib/monatomic/assets/javascripts/bootstrap/affix.js +162 -0
  21. data/lib/monatomic/assets/javascripts/bootstrap/alert.js +94 -0
  22. data/lib/monatomic/assets/javascripts/bootstrap/button.js +116 -0
  23. data/lib/monatomic/assets/javascripts/bootstrap/carousel.js +237 -0
  24. data/lib/monatomic/assets/javascripts/bootstrap/collapse.js +211 -0
  25. data/lib/monatomic/assets/javascripts/bootstrap/dropdown.js +161 -0
  26. data/lib/monatomic/assets/javascripts/bootstrap/modal.js +339 -0
  27. data/lib/monatomic/assets/javascripts/bootstrap/popover.js +108 -0
  28. data/lib/monatomic/assets/javascripts/bootstrap/scrollspy.js +172 -0
  29. data/lib/monatomic/assets/javascripts/bootstrap/tab.js +153 -0
  30. data/lib/monatomic/assets/javascripts/bootstrap/tooltip.js +476 -0
  31. data/lib/monatomic/assets/javascripts/bootstrap/transition.js +59 -0
  32. data/lib/monatomic/assets/javascripts/jquery-2.1.3.min.js +4 -0
  33. data/lib/monatomic/assets/javascripts/jquery_ujs.js +477 -0
  34. data/lib/monatomic/assets/javascripts/selectize.min.js +3 -0
  35. data/lib/monatomic/assets/stylesheets/application.scss +90 -0
  36. data/lib/monatomic/assets/stylesheets/bootstrap-datepicker3.css +752 -0
  37. data/lib/monatomic/assets/stylesheets/bootstrap.scss +60 -0
  38. data/lib/monatomic/assets/stylesheets/bootstrap/_alerts.scss +73 -0
  39. data/lib/monatomic/assets/stylesheets/bootstrap/_badges.scss +68 -0
  40. data/lib/monatomic/assets/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
  41. data/lib/monatomic/assets/stylesheets/bootstrap/_button-groups.scss +243 -0
  42. data/lib/monatomic/assets/stylesheets/bootstrap/_buttons.scss +160 -0
  43. data/lib/monatomic/assets/stylesheets/bootstrap/_carousel.scss +269 -0
  44. data/lib/monatomic/assets/stylesheets/bootstrap/_close.scss +36 -0
  45. data/lib/monatomic/assets/stylesheets/bootstrap/_code.scss +69 -0
  46. data/lib/monatomic/assets/stylesheets/bootstrap/_component-animations.scss +37 -0
  47. data/lib/monatomic/assets/stylesheets/bootstrap/_dropdowns.scss +214 -0
  48. data/lib/monatomic/assets/stylesheets/bootstrap/_forms.scss +578 -0
  49. data/lib/monatomic/assets/stylesheets/bootstrap/_glyphicons.scss +305 -0
  50. data/lib/monatomic/assets/stylesheets/bootstrap/_grid.scss +84 -0
  51. data/lib/monatomic/assets/stylesheets/bootstrap/_input-groups.scss +166 -0
  52. data/lib/monatomic/assets/stylesheets/bootstrap/_jumbotron.scss +50 -0
  53. data/lib/monatomic/assets/stylesheets/bootstrap/_labels.scss +66 -0
  54. data/lib/monatomic/assets/stylesheets/bootstrap/_list-group.scss +124 -0
  55. data/lib/monatomic/assets/stylesheets/bootstrap/_media.scss +61 -0
  56. data/lib/monatomic/assets/stylesheets/bootstrap/_mixins.scss +39 -0
  57. data/lib/monatomic/assets/stylesheets/bootstrap/_modals.scss +150 -0
  58. data/lib/monatomic/assets/stylesheets/bootstrap/_navbar.scss +662 -0
  59. data/lib/monatomic/assets/stylesheets/bootstrap/_navs.scss +242 -0
  60. data/lib/monatomic/assets/stylesheets/bootstrap/_normalize.scss +427 -0
  61. data/lib/monatomic/assets/stylesheets/bootstrap/_pager.scss +54 -0
  62. data/lib/monatomic/assets/stylesheets/bootstrap/_pagination.scss +88 -0
  63. data/lib/monatomic/assets/stylesheets/bootstrap/_panels.scss +265 -0
  64. data/lib/monatomic/assets/stylesheets/bootstrap/_popovers.scss +135 -0
  65. data/lib/monatomic/assets/stylesheets/bootstrap/_print.scss +107 -0
  66. data/lib/monatomic/assets/stylesheets/bootstrap/_progress-bars.scss +87 -0
  67. data/lib/monatomic/assets/stylesheets/bootstrap/_responsive-embed.scss +35 -0
  68. data/lib/monatomic/assets/stylesheets/bootstrap/_responsive-utilities.scss +177 -0
  69. data/lib/monatomic/assets/stylesheets/bootstrap/_scaffolding.scss +162 -0
  70. data/lib/monatomic/assets/stylesheets/bootstrap/_tables.scss +234 -0
  71. data/lib/monatomic/assets/stylesheets/bootstrap/_theme.scss +273 -0
  72. data/lib/monatomic/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
  73. data/lib/monatomic/assets/stylesheets/bootstrap/_tooltip.scss +102 -0
  74. data/lib/monatomic/assets/stylesheets/bootstrap/_type.scss +298 -0
  75. data/lib/monatomic/assets/stylesheets/bootstrap/_utilities.scss +55 -0
  76. data/lib/monatomic/assets/stylesheets/bootstrap/_variables.scss +866 -0
  77. data/lib/monatomic/assets/stylesheets/bootstrap/_wells.scss +29 -0
  78. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
  79. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
  80. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  81. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_buttons.scss +52 -0
  82. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  83. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  84. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_forms.scss +88 -0
  85. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
  86. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
  87. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  88. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  89. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_image.scss +33 -0
  90. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  91. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
  92. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  93. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  94. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
  95. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
  96. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_panels.scss +24 -0
  97. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
  98. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  99. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  100. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
  101. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  102. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  103. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  104. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
  105. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  106. data/lib/monatomic/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +222 -0
  107. data/lib/monatomic/assets/stylesheets/selectize.bootstrap3.css +401 -0
  108. data/lib/monatomic/controller.rb +154 -0
  109. data/lib/monatomic/helper.rb +114 -0
  110. data/lib/monatomic/locales/en.yml +21 -0
  111. data/lib/monatomic/models.rb +2 -0
  112. data/lib/monatomic/models/model.rb +248 -0
  113. data/lib/monatomic/models/user.rb +37 -0
  114. data/lib/monatomic/public/assets/application-d537e55235fbe513c876112de81f0334.js +4578 -0
  115. data/lib/monatomic/public/assets/application-d537e55235fbe513c876112de81f0334.js.gz +0 -0
  116. data/lib/monatomic/public/assets/application-e21e062fc2a24448e198c019f9c0721c.css +6865 -0
  117. data/lib/monatomic/public/assets/application-e21e062fc2a24448e198c019f9c0721c.css.gz +0 -0
  118. data/lib/monatomic/public/assets/bootstrap/glyphicons-halflings-regular-513af1c5182439377effce36c7813d33.eot +0 -0
  119. data/lib/monatomic/public/assets/bootstrap/glyphicons-halflings-regular-795f110aa27b39dffe83d4c7debd366f.ttf +0 -0
  120. data/lib/monatomic/public/assets/bootstrap/glyphicons-halflings-regular-9b034d31f97c53cfae213870811ba74d.svg +288 -0
  121. data/lib/monatomic/public/assets/bootstrap/glyphicons-halflings-regular-d2533ee9537f83620bb353cf5cddee17.woff +0 -0
  122. data/lib/monatomic/public/assets/manifest-e8294e69f9d97cc425dcce90af2fa06d.json +1 -0
  123. data/lib/monatomic/task.rb +4 -0
  124. data/lib/monatomic/types.rb +50 -0
  125. data/lib/monatomic/version.rb +3 -0
  126. data/lib/monatomic/views/edit.erb +29 -0
  127. data/lib/monatomic/views/editors/date.erb +6 -0
  128. data/lib/monatomic/views/editors/enumeration.erb +19 -0
  129. data/lib/monatomic/views/editors/integer.erb +6 -0
  130. data/lib/monatomic/views/editors/object.erb +1 -0
  131. data/lib/monatomic/views/editors/password.erb +6 -0
  132. data/lib/monatomic/views/editors/prompt.erb +19 -0
  133. data/lib/monatomic/views/editors/string.erb +6 -0
  134. data/lib/monatomic/views/editors/tags.erb +18 -0
  135. data/lib/monatomic/views/editors/text.erb +6 -0
  136. data/lib/monatomic/views/home.erb +1 -0
  137. data/lib/monatomic/views/index.erb +69 -0
  138. data/lib/monatomic/views/layout.erb +54 -0
  139. data/lib/monatomic/views/login.erb +62 -0
  140. data/lib/monatomic/views/presenters/object.erb +3 -0
  141. data/lib/monatomic/views/presenters/tags.erb +3 -0
  142. data/lib/monatomic/views/presenters/text.erb +1 -0
  143. data/lib/monatomic/views/show.erb +27 -0
  144. data/monatomic.gemspec +33 -0
  145. metadata +328 -0
@@ -0,0 +1,401 @@
1
+ /**
2
+ * selectize.bootstrap3.css (v0.12.1) - Bootstrap 3 Theme
3
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
+ * file except in compliance with the License. You may obtain a copy of the License at:
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under
10
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ * ANY KIND, either express or implied. See the License for the specific language
12
+ * governing permissions and limitations under the License.
13
+ *
14
+ * @author Brian Reavis <brian@thirdroute.com>
15
+ */
16
+ .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
17
+ visibility: visible !important;
18
+ background: #f2f2f2 !important;
19
+ background: rgba(0, 0, 0, 0.06) !important;
20
+ border: 0 none !important;
21
+ -webkit-box-shadow: inset 0 0 12px 4px #ffffff;
22
+ box-shadow: inset 0 0 12px 4px #ffffff;
23
+ }
24
+ .selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
25
+ content: '!';
26
+ visibility: hidden;
27
+ }
28
+ .selectize-control.plugin-drag_drop .ui-sortable-helper {
29
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
30
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
31
+ }
32
+ .selectize-dropdown-header {
33
+ position: relative;
34
+ padding: 3px 12px;
35
+ border-bottom: 1px solid #d0d0d0;
36
+ background: #f8f8f8;
37
+ -webkit-border-radius: 4px 4px 0 0;
38
+ -moz-border-radius: 4px 4px 0 0;
39
+ border-radius: 4px 4px 0 0;
40
+ }
41
+ .selectize-dropdown-header-close {
42
+ position: absolute;
43
+ right: 12px;
44
+ top: 50%;
45
+ color: #333333;
46
+ opacity: 0.4;
47
+ margin-top: -12px;
48
+ line-height: 20px;
49
+ font-size: 20px !important;
50
+ }
51
+ .selectize-dropdown-header-close:hover {
52
+ color: #000000;
53
+ }
54
+ .selectize-dropdown.plugin-optgroup_columns .optgroup {
55
+ border-right: 1px solid #f2f2f2;
56
+ border-top: 0 none;
57
+ float: left;
58
+ -webkit-box-sizing: border-box;
59
+ -moz-box-sizing: border-box;
60
+ box-sizing: border-box;
61
+ }
62
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
63
+ border-right: 0 none;
64
+ }
65
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:before {
66
+ display: none;
67
+ }
68
+ .selectize-dropdown.plugin-optgroup_columns .optgroup-header {
69
+ border-top: 0 none;
70
+ }
71
+ .selectize-control.plugin-remove_button [data-value] {
72
+ position: relative;
73
+ padding-right: 24px !important;
74
+ }
75
+ .selectize-control.plugin-remove_button [data-value] .remove {
76
+ z-index: 1;
77
+ /* fixes ie bug (see #392) */
78
+ position: absolute;
79
+ top: 0;
80
+ right: 0;
81
+ bottom: 0;
82
+ width: 17px;
83
+ text-align: center;
84
+ font-weight: bold;
85
+ font-size: 12px;
86
+ color: inherit;
87
+ text-decoration: none;
88
+ vertical-align: middle;
89
+ display: inline-block;
90
+ padding: 1px 0 0 0;
91
+ border-left: 1px solid rgba(0, 0, 0, 0);
92
+ -webkit-border-radius: 0 2px 2px 0;
93
+ -moz-border-radius: 0 2px 2px 0;
94
+ border-radius: 0 2px 2px 0;
95
+ -webkit-box-sizing: border-box;
96
+ -moz-box-sizing: border-box;
97
+ box-sizing: border-box;
98
+ }
99
+ .selectize-control.plugin-remove_button [data-value] .remove:hover {
100
+ background: rgba(0, 0, 0, 0.05);
101
+ }
102
+ .selectize-control.plugin-remove_button [data-value].active .remove {
103
+ border-left-color: rgba(0, 0, 0, 0);
104
+ }
105
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
106
+ background: none;
107
+ }
108
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove {
109
+ border-left-color: rgba(77, 77, 77, 0);
110
+ }
111
+ .selectize-control {
112
+ position: relative;
113
+ }
114
+ .selectize-dropdown,
115
+ .selectize-input,
116
+ .selectize-input input {
117
+ color: #333333;
118
+ font-family: inherit;
119
+ font-size: inherit;
120
+ line-height: 20px;
121
+ -webkit-font-smoothing: inherit;
122
+ }
123
+ .selectize-input,
124
+ .selectize-control.single .selectize-input.input-active {
125
+ background: #ffffff;
126
+ cursor: text;
127
+ display: inline-block;
128
+ }
129
+ .selectize-input {
130
+ border: 1px solid #cccccc;
131
+ padding: 6px 12px;
132
+ display: inline-block;
133
+ width: 100%;
134
+ overflow: hidden;
135
+ position: relative;
136
+ z-index: 1;
137
+ -webkit-box-sizing: border-box;
138
+ -moz-box-sizing: border-box;
139
+ box-sizing: border-box;
140
+ -webkit-box-shadow: none;
141
+ box-shadow: none;
142
+ -webkit-border-radius: 4px;
143
+ -moz-border-radius: 4px;
144
+ border-radius: 4px;
145
+ }
146
+ .selectize-control.multi .selectize-input.has-items {
147
+ padding: 5px 12px 2px;
148
+ }
149
+ .selectize-input.full {
150
+ background-color: #ffffff;
151
+ }
152
+ .selectize-input.disabled,
153
+ .selectize-input.disabled * {
154
+ cursor: default !important;
155
+ }
156
+ .selectize-input.focus {
157
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
158
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
159
+ }
160
+ .selectize-input.dropdown-active {
161
+ -webkit-border-radius: 4px 4px 0 0;
162
+ -moz-border-radius: 4px 4px 0 0;
163
+ border-radius: 4px 4px 0 0;
164
+ }
165
+ .selectize-input > * {
166
+ vertical-align: baseline;
167
+ display: -moz-inline-stack;
168
+ display: inline-block;
169
+ zoom: 1;
170
+ *display: inline;
171
+ }
172
+ .selectize-control.multi .selectize-input > div {
173
+ cursor: pointer;
174
+ margin: 0 3px 3px 0;
175
+ padding: 1px 3px;
176
+ background: #efefef;
177
+ color: #333333;
178
+ border: 0 solid rgba(0, 0, 0, 0);
179
+ }
180
+ .selectize-control.multi .selectize-input > div.active {
181
+ background: #428bca;
182
+ color: #ffffff;
183
+ border: 0 solid rgba(0, 0, 0, 0);
184
+ }
185
+ .selectize-control.multi .selectize-input.disabled > div,
186
+ .selectize-control.multi .selectize-input.disabled > div.active {
187
+ color: #808080;
188
+ background: #ffffff;
189
+ border: 0 solid rgba(77, 77, 77, 0);
190
+ }
191
+ .selectize-input > input {
192
+ display: inline-block !important;
193
+ padding: 0 !important;
194
+ min-height: 0 !important;
195
+ max-height: none !important;
196
+ max-width: 100% !important;
197
+ margin: 0 !important;
198
+ text-indent: 0 !important;
199
+ border: 0 none !important;
200
+ background: none !important;
201
+ line-height: inherit !important;
202
+ -webkit-user-select: auto !important;
203
+ -webkit-box-shadow: none !important;
204
+ box-shadow: none !important;
205
+ }
206
+ .selectize-input > input::-ms-clear {
207
+ display: none;
208
+ }
209
+ .selectize-input > input:focus {
210
+ outline: none !important;
211
+ }
212
+ .selectize-input::after {
213
+ content: ' ';
214
+ display: block;
215
+ clear: left;
216
+ }
217
+ .selectize-input.dropdown-active::before {
218
+ content: ' ';
219
+ display: block;
220
+ position: absolute;
221
+ background: #ffffff;
222
+ height: 1px;
223
+ bottom: 0;
224
+ left: 0;
225
+ right: 0;
226
+ }
227
+ .selectize-dropdown {
228
+ position: absolute;
229
+ z-index: 10;
230
+ border: 1px solid #d0d0d0;
231
+ background: #ffffff;
232
+ margin: -1px 0 0 0;
233
+ border-top: 0 none;
234
+ -webkit-box-sizing: border-box;
235
+ -moz-box-sizing: border-box;
236
+ box-sizing: border-box;
237
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
238
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
239
+ -webkit-border-radius: 0 0 4px 4px;
240
+ -moz-border-radius: 0 0 4px 4px;
241
+ border-radius: 0 0 4px 4px;
242
+ }
243
+ .selectize-dropdown [data-selectable] {
244
+ cursor: pointer;
245
+ overflow: hidden;
246
+ }
247
+ .selectize-dropdown [data-selectable] .highlight {
248
+ background: rgba(255, 237, 40, 0.4);
249
+ -webkit-border-radius: 1px;
250
+ -moz-border-radius: 1px;
251
+ border-radius: 1px;
252
+ }
253
+ .selectize-dropdown [data-selectable],
254
+ .selectize-dropdown .optgroup-header {
255
+ padding: 3px 12px;
256
+ }
257
+ .selectize-dropdown .optgroup:first-child .optgroup-header {
258
+ border-top: 0 none;
259
+ }
260
+ .selectize-dropdown .optgroup-header {
261
+ color: #777777;
262
+ background: #ffffff;
263
+ cursor: default;
264
+ }
265
+ .selectize-dropdown .active {
266
+ background-color: #f5f5f5;
267
+ color: #262626;
268
+ }
269
+ .selectize-dropdown .active.create {
270
+ color: #262626;
271
+ }
272
+ .selectize-dropdown .create {
273
+ color: rgba(51, 51, 51, 0.5);
274
+ }
275
+ .selectize-dropdown-content {
276
+ overflow-y: auto;
277
+ overflow-x: hidden;
278
+ max-height: 200px;
279
+ }
280
+ .selectize-control.single .selectize-input,
281
+ .selectize-control.single .selectize-input input {
282
+ cursor: pointer;
283
+ }
284
+ .selectize-control.single .selectize-input.input-active,
285
+ .selectize-control.single .selectize-input.input-active input {
286
+ cursor: text;
287
+ }
288
+ .selectize-control.single .selectize-input:after {
289
+ content: ' ';
290
+ display: block;
291
+ position: absolute;
292
+ top: 50%;
293
+ right: 17px;
294
+ margin-top: -3px;
295
+ width: 0;
296
+ height: 0;
297
+ border-style: solid;
298
+ border-width: 5px 5px 0 5px;
299
+ border-color: #333333 transparent transparent transparent;
300
+ }
301
+ .selectize-control.single .selectize-input.dropdown-active:after {
302
+ margin-top: -4px;
303
+ border-width: 0 5px 5px 5px;
304
+ border-color: transparent transparent #333333 transparent;
305
+ }
306
+ .selectize-control.rtl.single .selectize-input:after {
307
+ left: 17px;
308
+ right: auto;
309
+ }
310
+ .selectize-control.rtl .selectize-input > input {
311
+ margin: 0 4px 0 -2px !important;
312
+ }
313
+ .selectize-control .selectize-input.disabled {
314
+ opacity: 0.5;
315
+ background-color: #ffffff;
316
+ }
317
+ .selectize-dropdown,
318
+ .selectize-dropdown.form-control {
319
+ height: auto;
320
+ padding: 0;
321
+ margin: 2px 0 0 0;
322
+ z-index: 1000;
323
+ background: #ffffff;
324
+ border: 1px solid #cccccc;
325
+ border: 1px solid rgba(0, 0, 0, 0.15);
326
+ -webkit-border-radius: 4px;
327
+ -moz-border-radius: 4px;
328
+ border-radius: 4px;
329
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
330
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
331
+ }
332
+ .selectize-dropdown .optgroup-header {
333
+ font-size: 12px;
334
+ line-height: 1.42857143;
335
+ }
336
+ .selectize-dropdown .optgroup:first-child:before {
337
+ display: none;
338
+ }
339
+ .selectize-dropdown .optgroup:before {
340
+ content: ' ';
341
+ display: block;
342
+ height: 1px;
343
+ margin: 9px 0;
344
+ overflow: hidden;
345
+ background-color: #e5e5e5;
346
+ margin-left: -12px;
347
+ margin-right: -12px;
348
+ }
349
+ .selectize-dropdown-content {
350
+ padding: 5px 0;
351
+ }
352
+ .selectize-dropdown-header {
353
+ padding: 6px 12px;
354
+ }
355
+ .selectize-input {
356
+ min-height: 34px;
357
+ }
358
+ .selectize-input.dropdown-active {
359
+ -webkit-border-radius: 4px;
360
+ -moz-border-radius: 4px;
361
+ border-radius: 4px;
362
+ }
363
+ .selectize-input.dropdown-active::before {
364
+ display: none;
365
+ }
366
+ .selectize-input.focus {
367
+ border-color: #66afe9;
368
+ outline: 0;
369
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
370
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
371
+ }
372
+ .has-error .selectize-input {
373
+ border-color: #a94442;
374
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
375
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
376
+ }
377
+ .has-error .selectize-input:focus {
378
+ border-color: #843534;
379
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
380
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
381
+ }
382
+ .selectize-control.multi .selectize-input.has-items {
383
+ padding-left: 9px;
384
+ padding-right: 9px;
385
+ }
386
+ .selectize-control.multi .selectize-input > div {
387
+ -webkit-border-radius: 3px;
388
+ -moz-border-radius: 3px;
389
+ border-radius: 3px;
390
+ }
391
+ .form-control.selectize-control {
392
+ padding: 0;
393
+ height: auto;
394
+ border: none;
395
+ background: none;
396
+ -webkit-box-shadow: none;
397
+ box-shadow: none;
398
+ -webkit-border-radius: 0;
399
+ -moz-border-radius: 0;
400
+ border-radius: 0;
401
+ }
@@ -0,0 +1,154 @@
1
+ require "rubyXL"
2
+
3
+ Monatomic::Application.class_exec do
4
+ get "/" do
5
+ if current_user
6
+ erb :home
7
+ else
8
+ erb :login, layout: false
9
+ end
10
+ end
11
+
12
+ # login
13
+ post "/" do
14
+ user = User.where(uid: params[:uid]).first if params[:uid].present?
15
+ if user and user.validate_password(params[:password])
16
+ session[:uid] = user.id.to_s
17
+ else
18
+ session[:flash] = t(:wrong_username_or_password)
19
+ end
20
+ redirect "/"
21
+ end
22
+
23
+ get "/_logout" do
24
+ session.delete :uid
25
+ redirect "/"
26
+ end
27
+
28
+ # index
29
+ get "/:resources.?:format?" do
30
+ require_user_and_prepare_resources
31
+ @fields = @model.fields_for(current_user)
32
+ case params[:format]
33
+ when "json"
34
+ content_type :json
35
+ @resources.to_json(user: current_user)
36
+ when "xlsx"
37
+ send_xlsx
38
+ else
39
+ @columns = @model.fields_for(current_user, limit: @model.display_fields)
40
+ erb :index
41
+ end
42
+ end
43
+
44
+ # create
45
+ post "/:resources" do
46
+ require_user_and_prepare_resources
47
+ @resource = @resources.new(created_by: current_user)
48
+ params["data"].each do |k, v|
49
+ unless @resource.writable? current_user, k
50
+ @resource.errors.add(k, t(:not_allowed) % v)
51
+ end
52
+ end
53
+ @resource.assign_attributes(params["data"])
54
+ if @resource.valid? and @resource.save
55
+ session[:flash] = t(:create_successfully) % [t(@model), @resource.display_name]
56
+ redirect path_for(@resource.id)
57
+ else
58
+ erb :edit
59
+ end
60
+ end
61
+
62
+ # new
63
+ get "/:resources/new" do
64
+ require_user_and_prepare_resources
65
+ @resource = @resources.new
66
+ erb :edit
67
+ end
68
+
69
+ # show
70
+ get "/:resources/:id.?:format?" do
71
+ require_user_and_prepare_resources
72
+ @fields = @model.fields_for(current_user)
73
+ if params[:format] == "json"
74
+ content_type :json
75
+ @resource.to_json(user: current_user)
76
+ else
77
+ erb :show
78
+ end
79
+ end
80
+
81
+ # update
82
+ # We use post for best compatibility
83
+ post "/:resources/:id" do
84
+ require_user_and_prepare_resources
85
+ params["data"].each do |k, v|
86
+ unless @resource.writable? current_user, k
87
+ @resource.errors.add(k, t(:not_allowed) % v)
88
+ end
89
+ # https://github.com/rails/rails/blob/71c7fd101324046995d8f7e51e78475c0e37ec1a/actionview/lib/action_view/helpers/form_options_helper.rb#L140
90
+ v.shift if v.is_a? Array
91
+ end
92
+ if @resource.errors.empty? and @resource.assign_attributes(params["data"]) and @resource.valid? and @resource.save
93
+ session[:flash] = t(:update_successfully) % [@model.display_name, @resource.display_name]
94
+ redirect path_for(@resource.id)
95
+ else
96
+ @resource.assign_attributes(params["data"])
97
+ erb :edit
98
+ end
99
+ end
100
+
101
+ # edit
102
+ get "/:resources/:id/edit" do
103
+ require_user_and_prepare_resources
104
+ erb :edit
105
+ end
106
+
107
+ # delete
108
+ post "/:resources/:id/delete" do
109
+ require_user_and_prepare_resources
110
+ @resource.destroy if @resource.deletable? current_user
111
+ session[:flash] = t(:delete_successfully) % [@model.display_name, @resource.display_name]
112
+ redirect path_for
113
+ end
114
+
115
+ def require_user_and_prepare_resources
116
+ redirect "/" unless current_user
117
+ begin
118
+ @model = params[:resources].classify.constantize
119
+ rescue NameError
120
+ end
121
+ @resources = @model && @model.for(current_user)
122
+ halt t(:not_authorized) if @resources.nil?
123
+ if params[:search].present?
124
+ available_fields = @model.fields_for(current_user).map(&:name)
125
+ query = {}
126
+ params[:search].split.each do |e|
127
+ if e =~ /:/
128
+ k, v = e.split(":", 2)
129
+ query[k] ||= []
130
+ query[k] << /#{Regexp.escape(v)}/i
131
+ else
132
+ @model.search_fields.each do |f|
133
+ query[f.to_s] ||= []
134
+ query[f.to_s] << /#{Regexp.escape(e)}/i
135
+ end
136
+ end
137
+ end
138
+ query = query.map do |k, v|
139
+ {"$and" => v.map { |e| {k => e} }} if k.in? available_fields
140
+ end.reject(&:nil?)
141
+ @resources = @resources.and("$or" => query) if query.present?
142
+ end
143
+ if params[:sort].present?
144
+ if params[:sort][0] == "-"
145
+ @resources = @resources.order_by(params[:sort][1..-1] => -1)
146
+ else
147
+ @resources = @resources.order_by(params[:sort] => 1)
148
+ end
149
+ end
150
+ @resources = @resources.includes(:created_by)
151
+ return if params[:id].blank?
152
+ @resource = @resources.find(params[:id])
153
+ end
154
+ end