integral 1.1.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +6 -33
- data/Rakefile +1 -1
- data/app/assets/images/integral/defaults/no_image_available.jpg +0 -0
- data/app/assets/images/logo.png +0 -0
- data/app/assets/javascripts/ckeditor/my_config.js.erb +26 -18
- data/app/assets/javascripts/ckeditor/plugins/autoembed/lang/lv.js +8 -0
- data/app/assets/javascripts/ckeditor/plugins/autoembed/plugin.js +1 -1
- data/app/assets/javascripts/ckeditor/plugins/autogrow/plugin.js +14 -14
- data/app/assets/javascripts/ckeditor/plugins/autogrow/samples/autogrow.html +8 -8
- data/app/assets/javascripts/ckeditor/plugins/codemirror/css/codemirror.min.css +1 -1
- data/app/assets/javascripts/ckeditor/plugins/codemirror/icons/autoformat.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/icons/searchcode.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/icons/uncommentselectedrange.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/images/autocomplete.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/images/autoformat.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/images/commentselectedrange.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/images/searchcode.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/images/uncommentselectedrange.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/beautify.min.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.addons.min.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.addons.search.min.js +1 -1
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.min.js +1 -6
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.bbcodemixed.min.js +1 -1
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.handlebars.min.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.htmlmixed.min.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.javascript.min.js +1 -1
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.php.min.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.twig.min.js +1 -1
- data/app/assets/javascripts/ckeditor/plugins/codemirror/lang/bg.js +7 -7
- data/app/assets/javascripts/ckeditor/plugins/codemirror/plugin.js +231 -217
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/darcula.css +46 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/gruvbox-dark.css +34 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/idea.css +42 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/lesser-dark.css +1 -1
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/lucario.css +37 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/monokai.css +5 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/oceanic-next.css +44 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/shadowfox.css +52 -0
- data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/ssms.css +16 -0
- data/app/assets/javascripts/ckeditor/plugins/embedbase/lang/ar.js +15 -0
- data/app/assets/javascripts/ckeditor/plugins/embedbase/lang/lv.js +15 -0
- data/app/assets/javascripts/ckeditor/plugins/embedbase/plugin.js +1 -1
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/copywidget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/editwidget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/copywidget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/editwidget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/removewidget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/widget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/removewidget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/widget.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/foundation-callout/plugin.js +86 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/dev/assets/image1.jpg +0 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/dev/assets/image2.jpg +0 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/dev/contents.css +35 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/dev/image2.html +339 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/dialogs/image2.js +553 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/icons/hidpi/image.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/icons/image.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/af.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ar.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/az.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/bg.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/bn.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/bs.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ca.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/cs.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/cy.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/da.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/de-ch.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/de.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/el.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/en-au.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/en-ca.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/en-gb.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/en.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/eo.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/es-mx.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/es.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/et.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/eu.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/fa.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/fi.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/fo.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/fr-ca.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/fr.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/gl.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/gu.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/he.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/hi.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/hr.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/hu.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/id.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/is.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/it.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ja.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ka.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/km.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ko.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ku.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/lt.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/lv.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/mk.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/mn.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ms.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/nb.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/nl.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/no.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/oc.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/pl.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/pt-br.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/pt.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ro.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ru.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/si.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/sk.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/sl.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/sq.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/sr-latn.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/sr.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/sv.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/th.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/tr.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/tt.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/ug.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/uk.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/vi.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/zh-cn.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/lang/zh.js +21 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/plugin.js +1720 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/samples/assets/image1.jpg +0 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/samples/assets/image2.jpg +0 -0
- data/app/assets/javascripts/ckeditor/plugins/image2/samples/image2.html +68 -0
- data/app/assets/javascripts/ckeditor/plugins/lineutils/dev/dnd.html +4 -4
- data/app/assets/javascripts/ckeditor/plugins/lineutils/dev/magicfinger.html +4 -4
- data/app/assets/javascripts/ckeditor/plugins/lineutils/plugin.js +7 -7
- data/app/assets/javascripts/ckeditor/plugins/linkballoon/README.md +5 -0
- data/app/assets/javascripts/ckeditor/plugins/linkballoon/assets/demo.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/linkballoon/plugin.js +25 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/az.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/bg.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/ca.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/cs.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/da.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/de-ch.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/de.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/en-au.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/en.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/eo.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/es-mx.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/es.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/et.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/eu.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/fa.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/fr.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/gl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/hr.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/hu.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/id.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/it.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/ja.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/km.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/ko.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/ku.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/lv.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/nb.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/nl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/oc.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/pl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/pt-br.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/pt.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/ro.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/ru.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/sk.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/sq.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/sv.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/tr.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/ug.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/uk.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/zh-cn.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/notification/lang/zh.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/notification/plugin.js +794 -784
- data/app/assets/javascripts/ckeditor/plugins/openlink/README.md +50 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/icons/hidpi/openLink.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/icons/openLink.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/lang/bg.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/lang/de.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/lang/en.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/lang/pl.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/lang/ru.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/lang/uk.js +7 -0
- data/app/assets/javascripts/ckeditor/plugins/openlink/plugin.js +178 -0
- data/app/assets/javascripts/ckeditor/plugins/placeholder/dev/placeholder.html +5 -5
- data/app/assets/javascripts/ckeditor/plugins/placeholder/dialogs/placeholder.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/af.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ar.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/az.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/bg.js +5 -5
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ca.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/cs.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/cy.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/da.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/de-ch.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/de.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/el.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en-au.js +12 -0
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en-gb.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/eo.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/es-mx.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/es.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/et.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/eu.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fa.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fi.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fr-ca.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fr.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/gl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/he.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/hr.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/hu.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/id.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/it.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ja.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/km.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ko.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ku.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/lv.js +5 -5
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/nb.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/nl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/no.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/oc.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/pl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/pt-br.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/pt.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ro.js +12 -0
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ru.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/si.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sk.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sq.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sv.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/th.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/tr.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/tt.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ug.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/uk.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/vi.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/zh-cn.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/zh.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/placeholder/plugin.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/placeholder/samples/placeholder.html +6 -6
- data/app/assets/javascripts/ckeditor/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js +4 -4
- data/app/assets/javascripts/ckeditor/plugins/widget/dev/assets/simplebox/plugin.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/widget/dev/console.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/dev/nestedwidgets.html +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/dev/widgetstyles.html +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/af.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ar.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/az.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/bg.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ca.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/cs.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/cy.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/da.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/de-ch.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/de.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/el.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/en-au.js +8 -0
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/en-gb.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/en.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/eo.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/es-mx.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/es.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/et.js +8 -0
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/eu.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/fa.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/fi.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/fr.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/gl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/he.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/hr.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/hu.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/id.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/it.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ja.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/km.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ko.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ku.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/lv.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/nb.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/nl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/no.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/oc.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/pl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/pt-br.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/pt.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ro.js +8 -0
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ru.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/sk.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/sl.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/sq.js +3 -3
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/sv.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/tr.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/tt.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/ug.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/uk.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/vi.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/zh-cn.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/lang/zh.js +2 -2
- data/app/assets/javascripts/ckeditor/plugins/widget/plugin.js +235 -64
- data/app/assets/javascripts/ckeditor/plugins/widgetselection/plugin.js +6 -11
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ar.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/bg.js +17 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ca.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/cs.js +15 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/da.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/de.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/el.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/en.js +5 -1
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/es.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/eu.js +17 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/fa.js +13 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/fi.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/fr.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/he.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/hr.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/hu.js +14 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/it.js +4 -3
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ja.js +5 -5
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ko.js +16 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/nl.js +3 -2
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/no.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/pl.js +4 -3
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/pt-br.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/pt.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ro.js +15 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ru.js +2 -1
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/sk.js +15 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/sv.js +5 -3
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/tr.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/uk.js +17 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/zh-cn.js +1 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/zh.js +14 -0
- data/app/assets/javascripts/ckeditor/plugins/wordcount/plugin.js +485 -302
- data/app/assets/javascripts/ckeditor/plugins/wordcount/samples/maxParagraphs.html +26 -0
- data/app/assets/javascripts/integral/backend.js +196 -25
- data/app/assets/javascripts/integral/frontend.js +37 -2
- data/app/assets/javascripts/integral/support/character_counter.js +13 -8
- data/app/assets/javascripts/integral/support/confirm_modal.coffee +2 -2
- data/app/assets/javascripts/integral/support/date_picker.coffee +54 -59
- data/app/assets/javascripts/integral/support/gallery.coffee +71 -54
- data/app/assets/javascripts/integral/support/grid.coffee +11 -4
- data/app/assets/javascripts/integral/support/lib/lazysizes.js +755 -0
- data/app/assets/javascripts/integral/support/lib/materialize-tags.js +49 -44
- data/app/assets/javascripts/integral/support/list.coffee +1 -0
- data/app/assets/javascripts/integral/support/ls.instagram.js +57 -0
- data/app/assets/javascripts/integral/support/ls.twitter.js +66 -0
- data/app/assets/javascripts/integral/support/record_selector.coffee +3 -1
- data/app/assets/javascripts/integral/support/remote_form.coffee +18 -11
- data/app/assets/javascripts/integral/support/slug_generator.coffee +1 -0
- data/app/assets/stylesheets/integral/backend.sass +36 -24
- data/app/assets/stylesheets/integral/backend/_foundation_settings.scss +5 -6
- data/app/assets/stylesheets/integral/backend/dashboard-layout.scss +31 -64
- data/app/assets/stylesheets/integral/backend/devise.sass +2 -3
- data/app/assets/stylesheets/integral/backend/materialize-tags.sass +2 -1
- data/app/assets/stylesheets/integral/backend/modules/dropdown_pane_notifications.scss +150 -0
- data/app/assets/stylesheets/integral/backend/modules/dropdown_pane_profile.scss +59 -0
- data/app/assets/stylesheets/integral/backend/modules/timeline.scss +214 -0
- data/app/assets/stylesheets/integral/backend/shared.sass +121 -13
- data/app/assets/stylesheets/integral/frontend.scss +45 -0
- data/app/assets/stylesheets/integral/frontend/_foundation_settings.scss +2 -2
- data/app/assets/stylesheets/integral/frontend/blog.sass +155 -142
- data/app/assets/stylesheets/integral/frontend/layout.sass +13 -3
- data/app/assets/stylesheets/integral/frontend/modules/article-footer.scss +55 -0
- data/app/assets/stylesheets/integral/frontend/modules/article.scss +34 -0
- data/app/assets/stylesheets/integral/frontend/modules/horizontal-post.scss +44 -0
- data/app/assets/stylesheets/integral/frontend/modules/inline-articles.scss +23 -0
- data/app/assets/stylesheets/integral/frontend/modules/latest-post.scss +37 -0
- data/app/assets/stylesheets/integral/frontend/modules/list-widget.scss +50 -0
- data/app/assets/stylesheets/integral/frontend/modules/piped-list.scss +33 -0
- data/app/assets/stylesheets/integral/frontend/modules/post-tags.scss +19 -0
- data/app/assets/stylesheets/integral/frontend/modules/scroll-container.scss +9 -0
- data/app/assets/stylesheets/integral/frontend/modules/sidebar-articles.scss +42 -0
- data/app/assets/stylesheets/integral/frontend/modules/sidebar-tags.scss +6 -0
- data/app/assets/stylesheets/integral/frontend/modules/sidebar-widget.scss +47 -0
- data/app/assets/stylesheets/integral/frontend/modules/vertical-post.scss +31 -0
- data/app/assets/stylesheets/integral/frontend/share_modal.sass +0 -5
- data/app/assets/stylesheets/integral/support/gallery.sass +8 -0
- data/app/assets/stylesheets/integral/support/media-query-indicator.sass +9 -3
- data/app/controllers/integral/application_controller.rb +10 -3
- data/app/controllers/integral/backend/activities_controller.rb +31 -26
- data/app/controllers/integral/backend/base_controller.rb +265 -26
- data/app/controllers/integral/backend/categories_controller.rb +49 -0
- data/app/controllers/integral/backend/images_controller.rb +39 -54
- data/app/controllers/integral/backend/lists_controller.rb +16 -98
- data/app/controllers/integral/backend/notification_subscriptions_controller.rb +23 -0
- data/app/controllers/integral/backend/pages_controller.rb +15 -117
- data/app/controllers/integral/backend/posts_controller.rb +22 -108
- data/app/controllers/integral/backend/settings_controller.rb +7 -8
- data/app/controllers/integral/backend/static_pages_controller.rb +14 -0
- data/app/controllers/integral/backend/users_controller.rb +61 -79
- data/app/controllers/integral/blog_controller.rb +12 -0
- data/app/controllers/integral/categories_controller.rb +45 -0
- data/app/controllers/integral/pages_controller.rb +3 -3
- data/app/controllers/integral/posts_controller.rb +7 -9
- data/app/controllers/integral/tags_controller.rb +5 -2
- data/app/decorators/integral/base_decorator.rb +16 -0
- data/app/decorators/integral/category_decorator.rb +30 -0
- data/app/decorators/integral/image_decorator.rb +3 -3
- data/app/decorators/integral/list_decorator.rb +1 -13
- data/app/decorators/integral/notification/notification_decorator.rb +74 -0
- data/app/decorators/integral/page_decorator.rb +1 -13
- data/app/decorators/integral/paginating_decorator.rb +6 -0
- data/app/decorators/integral/post_decorator.rb +44 -4
- data/app/decorators/integral/user_decorator.rb +1 -13
- data/app/decorators/integral/version_decorator.rb +58 -15
- data/app/helpers/integral/application_helper.rb +7 -0
- data/app/helpers/integral/backend/base_helper.rb +135 -15
- data/app/helpers/integral/blog_helper.rb +46 -0
- data/app/helpers/integral/social_helper.rb +0 -23
- data/app/jobs/integral/application_job.rb +1 -0
- data/app/jobs/integral/newsletter_signup_job.rb +0 -2
- data/app/jobs/integral/webhook/delivery_job.rb +37 -0
- data/app/mailers/integral/contact_mailer.rb +4 -1
- data/app/mailers/integral/devise_mailer.rb +6 -0
- data/app/models/concerns/integral/lazy_contentable.rb +54 -0
- data/app/models/concerns/integral/notification/subscribable.rb +67 -0
- data/app/models/concerns/integral/webhook/delivery.rb +30 -0
- data/app/models/concerns/integral/webhook/observable.rb +23 -0
- data/app/models/integral/application_record.rb +9 -0
- data/app/models/integral/category.rb +29 -0
- data/app/models/integral/category_version.rb +8 -0
- data/app/models/integral/image.rb +40 -3
- data/app/models/integral/list.rb +11 -4
- data/app/models/integral/list_item.rb +15 -16
- data/app/models/integral/list_item_connection.rb +6 -0
- data/app/models/integral/notification/notification.rb +28 -0
- data/app/models/integral/notification/subscription.rb +14 -0
- data/app/models/integral/page.rb +32 -10
- data/app/models/integral/post.rb +39 -14
- data/app/models/integral/user.rb +51 -2
- data/app/models/integral/version.rb +2 -2
- data/app/models/integral/webhook/endpoint.rb +40 -0
- data/app/models/integral/webhook/event.rb +20 -0
- data/app/policies/integral/base_policy.rb +7 -11
- data/app/policies/integral/category_policy.rb +9 -0
- data/app/policies/integral/page_policy.rb +1 -0
- data/app/policies/integral/version_policy.rb +0 -8
- data/app/serializers/integral/post_serializer.rb +24 -0
- data/app/uploaders/integral/avatar_uploader.rb +1 -1
- data/app/views/devise/invitations/edit.haml +1 -4
- data/app/views/devise/mailer/invitation_instructions.inky-haml +20 -0
- data/app/views/devise/sessions/new.haml +2 -2
- data/app/views/integral/backend/activities/_activity.haml +21 -0
- data/app/views/integral/backend/activities/grid/_dropdown_actions.haml +1 -0
- data/app/views/integral/backend/activities/grid/_row_content.haml +13 -0
- data/app/views/integral/backend/activities/index.haml +7 -13
- data/app/views/integral/backend/activities/shared/_grid.haml +35 -19
- data/app/views/integral/backend/activities/shared/index.haml +15 -0
- data/app/views/integral/backend/activities/shared/{_log.haml → show.haml} +7 -7
- data/app/views/integral/backend/activities/show.haml +1 -1
- data/app/views/integral/backend/categories/_modal.haml +24 -0
- data/app/views/integral/backend/images/_form.haml +16 -28
- data/app/views/integral/backend/images/edit.haml +2 -2
- data/app/views/integral/backend/images/grid/_dropdown_actions.haml +5 -0
- data/app/views/integral/backend/images/grid/_row_content.haml +5 -0
- data/app/views/integral/backend/images/index.haml +11 -17
- data/app/views/integral/backend/images/list.haml +11 -0
- data/app/views/integral/backend/images/show.haml +26 -0
- data/app/views/integral/backend/lists/_form.haml +7 -20
- data/app/views/integral/backend/lists/_item_container.haml +1 -1
- data/app/views/integral/backend/lists/_item_modal.haml +3 -3
- data/app/views/integral/backend/lists/_list_item_fields.haml +3 -2
- data/app/views/integral/backend/lists/_manager.haml +11 -13
- data/app/views/integral/backend/lists/edit.haml +11 -11
- data/app/views/integral/backend/lists/grid/_dropdown_actions.haml +9 -0
- data/app/views/integral/backend/lists/grid/_row_content.haml +3 -0
- data/app/views/integral/backend/lists/index.haml +11 -17
- data/app/views/integral/backend/lists/list.haml +11 -0
- data/app/views/integral/backend/lists/show.haml +30 -0
- data/app/views/integral/backend/notifications/_notification.haml +21 -0
- data/app/views/integral/backend/pages/_form.haml +20 -47
- data/app/views/integral/backend/pages/edit.haml +18 -0
- data/app/views/integral/backend/pages/grid/_dropdown_actions.haml +11 -0
- data/app/views/integral/backend/pages/grid/_row_content.haml +5 -0
- data/app/views/integral/backend/pages/index.haml +11 -21
- data/app/views/integral/backend/pages/list.haml +15 -0
- data/app/views/integral/backend/pages/show.haml +32 -0
- data/app/views/integral/backend/posts/_form.haml +19 -51
- data/app/views/integral/backend/posts/edit.haml +5 -10
- data/app/views/integral/backend/posts/grid/_dropdown_actions.haml +10 -0
- data/app/views/integral/backend/posts/grid/_row_content.haml +6 -0
- data/app/views/integral/backend/posts/index.haml +13 -19
- data/app/views/integral/backend/posts/list.haml +13 -0
- data/app/views/integral/backend/posts/new.haml +0 -1
- data/app/views/integral/backend/posts/show.haml +31 -0
- data/app/views/integral/backend/settings/sections/_social.haml +1 -3
- data/app/views/integral/backend/shared/_activity_modal.haml +13 -0
- data/app/views/integral/backend/shared/_breadcrumbs.haml +7 -4
- data/app/views/integral/backend/shared/_image_preview.haml +10 -3
- data/app/views/integral/backend/shared/_image_selector.haml +1 -1
- data/app/views/integral/backend/shared/_notification_subscription_toggle.haml +22 -0
- data/app/views/integral/backend/shared/action_bar/_index.haml +9 -0
- data/app/views/integral/backend/shared/action_bar/_show.haml +3 -0
- data/app/views/integral/backend/shared/cards/_at_a_glance.haml +3 -3
- data/app/views/integral/backend/shared/cards/_categories.haml +33 -0
- data/app/views/integral/backend/{static_pages/_card.haml → shared/cards/_object.haml} +1 -1
- data/app/views/integral/backend/shared/cards/_recent_activity.haml +20 -0
- data/app/views/integral/backend/shared/cards/_recent_resources.haml +17 -0
- data/app/views/integral/backend/shared/cards/_recent_user_activity.haml +1 -0
- data/app/views/integral/backend/shared/cards/_top_post_authors.haml +18 -0
- data/app/views/integral/backend/shared/cards/_welcome.haml +24 -25
- data/app/views/integral/backend/shared/{_empty_grid.haml → grid/_empty.haml} +0 -0
- data/app/views/integral/backend/shared/grid/_form.haml +9 -0
- data/app/views/integral/backend/shared/grid/_grid.haml +21 -0
- data/app/views/integral/backend/shared/{_pagination.haml → grid/_pagination.haml} +0 -0
- data/app/views/integral/backend/shared/grid/_row_layout.haml +8 -0
- data/app/views/integral/backend/shared/record_selector/_collection.haml +1 -0
- data/app/views/integral/backend/shared/record_selector/_modal.haml +9 -10
- data/app/views/integral/backend/shared/record_selector/_record.haml +6 -4
- data/app/views/integral/backend/static_pages/dashboard.haml +17 -16
- data/app/views/integral/backend/users/_form.haml +35 -47
- data/app/views/integral/backend/users/edit.haml +1 -1
- data/app/views/integral/backend/users/grid/_dropdown_actions.haml +17 -0
- data/app/views/integral/backend/users/grid/_row_content.haml +8 -0
- data/app/views/integral/backend/users/index.haml +11 -17
- data/app/views/integral/backend/users/list.haml +12 -0
- data/app/views/integral/backend/users/show.haml +22 -19
- data/app/views/integral/categories/show.haml +5 -0
- data/app/views/integral/posts/_article_footer.haml +17 -0
- data/app/views/integral/posts/_card.haml +11 -0
- data/app/views/integral/posts/_latest_post.haml +8 -0
- data/app/views/integral/posts/_most_read_section.haml +8 -0
- data/app/views/integral/posts/_post.haml +11 -0
- data/app/views/integral/posts/_similar_posts.haml +5 -0
- data/app/views/integral/posts/index.haml +7 -5
- data/app/views/integral/posts/templates/default.haml +35 -35
- data/app/views/integral/shared/_share_modal.haml +0 -3
- data/app/views/integral/shared/_social_list_items.haml +6 -12
- data/app/views/integral/shared/_subscribe_modal.haml +14 -0
- data/app/views/integral/shared/blog/_categories.haml +15 -0
- data/app/views/integral/shared/blog/_layout.haml +9 -0
- data/app/views/integral/shared/blog/_sidebar.haml +10 -0
- data/app/views/integral/shared/gallery/_placeholder.haml +1 -1
- data/app/views/integral/shared/gallery/_slide.haml +2 -2
- data/app/views/integral/shared/gallery/gallery.haml +5 -2
- data/app/views/integral/shared/sidebar/_item.haml +8 -0
- data/app/views/integral/shared/sidebar/_newsletter_signup.haml +7 -0
- data/app/views/integral/shared/sidebar/_popular_posts.haml +7 -0
- data/app/views/integral/shared/sidebar/_popular_tags.haml +7 -0
- data/app/views/integral/shared/sidebar/_recent_posts.haml +7 -0
- data/app/views/integral/tags/index.haml +2 -2
- data/app/views/integral/tags/show.haml +3 -6
- data/app/views/layouts/integral/backend.html.haml +27 -5
- data/app/views/layouts/integral/backend/_create_dropdown.haml +1 -30
- data/app/views/layouts/integral/backend/_main_menu_items.haml +1 -91
- data/app/views/layouts/integral/frontend.html.haml +3 -3
- data/config/initializers/devise.rb +1 -1
- data/config/locales/en.yml +127 -55
- data/config/routes.rb +2 -0
- data/db/migrate/20190414172018_create_webhook_endpoints.rb +10 -0
- data/db/migrate/20190929191412_add_integral_post_categories.rb +13 -0
- data/db/migrate/20191203090008_add_image_to_integral_categories.rb +6 -0
- data/db/migrate/20200401210442_create_category_versions.rb +20 -0
- data/db/migrate/20200407022636_create_integral_notifications.rb +25 -0
- data/db/migrate/20200421223602_add_status_to_integral_users.rb +5 -0
- data/db/seeds.rb +15 -9
- data/lib/generators/integral/assets_generator.rb +2 -2
- data/lib/generators/integral/install_generator.rb +1 -1
- data/lib/generators/integral/views_generator.rb +1 -1
- data/lib/generators/templates/app.yml +0 -1
- data/lib/generators/templates/integral.rb +5 -0
- data/lib/integral.rb +4 -30
- data/lib/integral/acts_as_integral.rb +115 -0
- data/lib/integral/acts_as_listable.rb +3 -3
- data/lib/integral/chart_renderer/base.rb +2 -0
- data/lib/integral/content_renderer.rb +2 -2
- data/lib/integral/engine.rb +12 -2
- data/lib/integral/grids/activities_grid.rb +15 -2
- data/lib/integral/grids/lists_grid.rb +1 -0
- data/lib/integral/grids/posts_grid.rb +5 -1
- data/lib/integral/grids/users_grid.rb +5 -0
- data/lib/integral/list_item_renderer.rb +4 -2
- data/lib/integral/list_renderer.rb +6 -1
- data/lib/integral/middleware/page_router.rb +15 -6
- data/lib/integral/router.rb +42 -8
- data/lib/integral/version.rb +1 -1
- data/lib/integral/widgets/swiper_list.rb +3 -2
- data/public/images/integral/demo/continous-integration.png +0 -0
- data/public/images/integral/demo/foundation-frontend-framework.jpg +0 -0
- data/public/images/integral/demo/heroku.png +0 -0
- data/public/images/integral/demo/integral-cms-without-hassle.jpg +0 -0
- data/public/images/integral/demo/integral-features-activity-tracking.jpg +0 -0
- data/public/images/integral/demo/integral-features-contact-form.png +0 -0
- data/public/images/integral/demo/integral-features-design.jpg +0 -0
- data/public/images/integral/demo/integral-features-dynamic-pages.jpg +0 -0
- data/public/images/integral/demo/integral-features-image-management.jpg +0 -0
- data/public/images/integral/demo/integral-features-integrated-blog.jpg +0 -0
- data/public/images/integral/demo/integral-features-list-management.jpg +0 -0
- data/public/images/integral/demo/integral-features-seo-ready.jpg +0 -0
- data/public/images/integral/demo/integral-features-user-management.jpg +0 -0
- data/public/images/integral/demo/integral-presentation.png +0 -0
- data/public/integral/ckeditor_demo_content.html +0 -13
- data/spec/factories.rb +30 -8
- metadata +305 -113
- data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/jp.js +0 -13
- data/app/assets/javascripts/integral/support/date_picker/picker.date.js +0 -1435
- data/app/assets/javascripts/integral/support/date_picker/picker.js +0 -1132
- data/app/assets/stylesheets/integral/frontend.sass +0 -26
- data/app/assets/stylesheets/integral/support/date-picker.scss +0 -16
- data/app/assets/stylesheets/integral/support/date_picker/_default.date.scss +0 -452
- data/app/assets/stylesheets/integral/support/date_picker/_default.scss +0 -201
- data/app/assets/stylesheets/integral/support/date_picker/materialize_clockpicker.sass +0 -220
- data/app/views/devise/mailer/invitation_instructions.html.erb +0 -13
- data/app/views/integral/backend/activities/_grid.haml +0 -23
- data/app/views/integral/backend/activities/shared/_listing.haml +0 -14
- data/app/views/integral/backend/images/_grid.haml +0 -16
- data/app/views/integral/backend/lists/_grid.haml +0 -14
- data/app/views/integral/backend/pages/_grid.haml +0 -21
- data/app/views/integral/backend/pages/activities.haml +0 -2
- data/app/views/integral/backend/pages/activity.haml +0 -1
- data/app/views/integral/backend/pages/edit.html.haml +0 -15
- data/app/views/integral/backend/posts/_grid.haml +0 -25
- data/app/views/integral/backend/posts/activities.haml +0 -3
- data/app/views/integral/backend/posts/activity.haml +0 -1
- data/app/views/integral/backend/shared/_grid.haml +0 -18
- data/app/views/integral/backend/users/_grid.haml +0 -19
- data/app/views/integral/posts/_collection.haml +0 -4
- data/app/views/integral/posts/_item.haml +0 -16
- data/app/views/integral/shared/_blog_layout.haml +0 -15
- data/app/views/integral/shared/_blog_sidebar.haml +0 -49
- data/lib/integral/slack_bot.rb +0 -45
data/app/models/integral/user.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
module Integral
|
2
2
|
# User model used to represent a authenticated user
|
3
3
|
class User < ApplicationRecord
|
4
|
-
# Soft-deletion
|
5
|
-
|
4
|
+
acts_as_paranoid # Soft-deletion
|
5
|
+
acts_as_integral({
|
6
|
+
backend_main_menu: { order: 60 },
|
7
|
+
backend_create_menu: { order: 50 }
|
8
|
+
}) # Integral Goodness
|
6
9
|
|
7
10
|
mount_uploader :avatar, AvatarUploader
|
8
11
|
process_in_background :avatar
|
@@ -11,9 +14,14 @@ module Integral
|
|
11
14
|
# :confirmable, :timeoutable, :omniauthable, registerable and lockable
|
12
15
|
devise :invitable, :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable
|
13
16
|
|
17
|
+
enum status: %i[pending active blocked]
|
18
|
+
|
14
19
|
# Relations
|
15
20
|
has_many :role_assignments
|
16
21
|
has_many :roles, through: :role_assignments
|
22
|
+
# notification_subscription is used by Subscribable concern - Users can have notification_subscriptions AND be subscribable
|
23
|
+
has_many :own_notification_subscriptions, class_name: "Integral::Notification::Subscription"
|
24
|
+
has_many :notifications, class_name: "Integral::Notification::Notification", foreign_key: :recipient_id
|
17
25
|
|
18
26
|
# Validations
|
19
27
|
validates :name, :email, presence: true
|
@@ -34,6 +42,10 @@ module Integral
|
|
34
42
|
roles.map { |r| r.name.underscore.to_sym }.any? { |user_role| role_sym.include?(user_role) }
|
35
43
|
end
|
36
44
|
|
45
|
+
def self.integral_icon
|
46
|
+
'user'
|
47
|
+
end
|
48
|
+
|
37
49
|
# @return [Array] containing available locales
|
38
50
|
def self.available_locales
|
39
51
|
available_locales = []
|
@@ -50,6 +62,43 @@ module Integral
|
|
50
62
|
name
|
51
63
|
end
|
52
64
|
|
65
|
+
def valid_password?(password)
|
66
|
+
return true if Rails.env.development?
|
67
|
+
|
68
|
+
super
|
69
|
+
end
|
70
|
+
|
71
|
+
def multiple_page_notifications?
|
72
|
+
notifications.count > Integral::Notification::Notification.per_page
|
73
|
+
end
|
74
|
+
|
75
|
+
# @param subscribable [Class or Instance]
|
76
|
+
def receives_notifications_for?(subscribable)
|
77
|
+
if subscribable.is_a?(Class)
|
78
|
+
subscription = own_notification_subscriptions.find_by(subscribable_type: subscribable.name, subscribable_id: nil)
|
79
|
+
|
80
|
+
return subscription.subscribed? if subscription
|
81
|
+
else
|
82
|
+
instance_subscription = own_notification_subscriptions.find_by(subscribable_type: subscribable.class.name, subscribable_id: subscribable.id)
|
83
|
+
|
84
|
+
return instance_subscription.subscribed? if instance_subscription
|
85
|
+
|
86
|
+
class_level_subscription = own_notification_subscriptions.find_by(subscribable_type: subscribable.class.name, subscribable_id: nil)
|
87
|
+
|
88
|
+
return class_level_subscription.subscribed? if class_level_subscription
|
89
|
+
end
|
90
|
+
|
91
|
+
notify_me
|
92
|
+
end
|
93
|
+
|
94
|
+
def active_for_authentication?
|
95
|
+
super && !blocked?
|
96
|
+
end
|
97
|
+
|
98
|
+
def inactive_message
|
99
|
+
blocked? ? :blocked : super
|
100
|
+
end
|
101
|
+
|
53
102
|
private
|
54
103
|
|
55
104
|
def send_devise_notification(notification, *args)
|
@@ -10,7 +10,7 @@ module Integral
|
|
10
10
|
def self.available_actions
|
11
11
|
available = []
|
12
12
|
|
13
|
-
%w[update create destroy].each do |item|
|
13
|
+
%w[update create destroy publish].each do |item|
|
14
14
|
available << [I18n.t("integral.actions.#{item}"), item]
|
15
15
|
end
|
16
16
|
|
@@ -21,7 +21,7 @@ module Integral
|
|
21
21
|
def self.available_objects
|
22
22
|
available = []
|
23
23
|
|
24
|
-
[Integral::Post, Integral::Page, Integral::List, Integral::Image, Integral::User].each do |item|
|
24
|
+
[Integral::Post, Integral::Category, Integral::Page, Integral::List, Integral::Image, Integral::User].concat(Integral.additional_tracked_classes).each do |item|
|
25
25
|
available << [item.model_name.human, item]
|
26
26
|
end
|
27
27
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Integral
|
2
|
+
# Webhook Implementation - https://benediktdeicke.com/2017/09/sending-webhooks-with-rails/
|
3
|
+
module Webhook
|
4
|
+
# A Webhook::Endpoint can listen to one or more Webhook::Event, everytime an Event is created
|
5
|
+
# it is sent (along with its payload) to the Endpoint target_url
|
6
|
+
class Endpoint < ApplicationRecord
|
7
|
+
self.table_name = 'integral_webhook_endpoints'
|
8
|
+
|
9
|
+
attribute :events, :string, array: true, default: []
|
10
|
+
|
11
|
+
validates :target_url,
|
12
|
+
presence: true,
|
13
|
+
format: URI.regexp(%w[http https])
|
14
|
+
|
15
|
+
validates :events,
|
16
|
+
presence: true
|
17
|
+
|
18
|
+
# @param events [Array] list of Integral::Webhook::Event names
|
19
|
+
#
|
20
|
+
# @return [Integral::Webhook::Endpoint] endpoints which are listening for the provided events
|
21
|
+
def self.for_event(events)
|
22
|
+
where('events @> ARRAY[?]::varchar[]', Array(events))
|
23
|
+
end
|
24
|
+
|
25
|
+
# Override the default setter to normalise the events and validate them (TODO)
|
26
|
+
def events=(events)
|
27
|
+
events = Array(events).map { |event| event.to_s.underscore }
|
28
|
+
# TODO: Validate events from specified list in Integral.config which can be used to
|
29
|
+
# list them on the backend for click and create
|
30
|
+
# super(Webhook::Event::EVENT_TYPES & events)
|
31
|
+
super(events)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Deliver a particular event to the endpoint
|
35
|
+
def deliver(event)
|
36
|
+
Webhook::DeliveryJob.perform_later(id, event.to_json)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Integral
|
2
|
+
# Webhook Implementation source from - https://benediktdeicke.com/2017/09/sending-webhooks-with-rails/
|
3
|
+
module Webhook
|
4
|
+
# An event instance which a Webhook::Endpoint might be listening too, for example a post publication, creation or deletion
|
5
|
+
class Event
|
6
|
+
attr_reader :event_name, :payload
|
7
|
+
|
8
|
+
def initialize(event_name, payload = {})
|
9
|
+
@event_name = event_name
|
10
|
+
@payload = payload
|
11
|
+
end
|
12
|
+
|
13
|
+
# Adds the event_name to the JSON representation
|
14
|
+
def as_json(*_args)
|
15
|
+
payload[:event_name] = event_name
|
16
|
+
payload
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -25,26 +25,22 @@ module Integral
|
|
25
25
|
!permitted_attribute?(attribute)
|
26
26
|
end
|
27
27
|
|
28
|
-
# @return [Array] attributes the user is
|
28
|
+
# @return [Array] attributes the user is authorized to edit
|
29
29
|
def permitted_attributes
|
30
30
|
raise NotImplementedError
|
31
31
|
end
|
32
32
|
|
33
|
+
%i[destroy block unblock index list show new create edit update duplicate grid receives_notifications].each do |method|
|
34
|
+
define_method "#{method}?" do
|
35
|
+
manager?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
33
39
|
private
|
34
40
|
|
35
41
|
# @return [Symbol] role name
|
36
42
|
def role_name
|
37
43
|
raise NotImplementedError
|
38
44
|
end
|
39
|
-
|
40
|
-
alias destroy? manager?
|
41
|
-
alias index? manager?
|
42
|
-
alias show? manager?
|
43
|
-
alias new? manager?
|
44
|
-
alias create? manager?
|
45
|
-
alias edit? manager?
|
46
|
-
alias update? manager?
|
47
|
-
alias clone? manager?
|
48
|
-
alias grid? manager?
|
49
45
|
end
|
50
46
|
end
|
@@ -1,18 +1,10 @@
|
|
1
1
|
module Integral
|
2
2
|
# Handles Activity authorization
|
3
3
|
class VersionPolicy < BasePolicy
|
4
|
-
# For some reason authorize_with_klass seems to be delegating manager? calls to BasePolicy rather than using the override
|
5
|
-
# app/controllers/integral/backend/activities_controller.rb:37:in `authorize_with_klass'
|
6
|
-
# @return [Boolean] whether or not user has manager access
|
7
|
-
def index?
|
8
|
-
manager?
|
9
|
-
end
|
10
|
-
|
11
4
|
def manager?
|
12
5
|
user.admin?
|
13
6
|
end
|
14
7
|
|
15
|
-
alias grid? manager?
|
16
8
|
alias activity? manager?
|
17
9
|
alias activities? manager?
|
18
10
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Integral
|
2
|
+
# Used too transform Integral::Post records into JSON format
|
3
|
+
class PostSerializer
|
4
|
+
include FastJsonapi::ObjectSerializer
|
5
|
+
|
6
|
+
attributes :title, :description, :status, :slug, :created_at, :updated_at, :published_at, :url, :body
|
7
|
+
|
8
|
+
attribute :author do |post|
|
9
|
+
post.author&.name
|
10
|
+
end
|
11
|
+
|
12
|
+
attribute :tags do |post|
|
13
|
+
post.tags.map(&:name).join(',')
|
14
|
+
end
|
15
|
+
|
16
|
+
attribute :featured_image do |post|
|
17
|
+
post&.featured_image&.url(:large)
|
18
|
+
end
|
19
|
+
|
20
|
+
attribute :preview_image do |post|
|
21
|
+
post&.preview_image&.url(:large)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -2,7 +2,7 @@ module Integral
|
|
2
2
|
# Handles uploading user avatars
|
3
3
|
class AvatarUploader < ImageUploader
|
4
4
|
# Provide a default URL as a default if there hasn't been a file uploaded
|
5
|
-
def default_url
|
5
|
+
def default_url(*args)
|
6
6
|
ActionController::Base.helpers.asset_path('integral/defaults/user_avatar.jpg')
|
7
7
|
end
|
8
8
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
.input-group
|
5
5
|
%span.input-group-label
|
6
6
|
= icon('key')
|
7
|
-
= f.input :password, input_html: { class: 'input-group-field' }, label: false
|
7
|
+
= f.input :password, input_html: { 'data-character-counter' => 'false', class: 'input-group-field' }, label: false
|
8
8
|
.input-group
|
9
9
|
%span.input-group-label
|
10
10
|
= icon('key')
|
@@ -12,6 +12,3 @@
|
|
12
12
|
|
13
13
|
.form-actions
|
14
14
|
= f.button :button, t("devise.invitations.edit.submit_button"), class: 'button expanded'
|
15
|
-
|
16
|
-
= render "devise/shared/links"
|
17
|
-
|
@@ -0,0 +1,20 @@
|
|
1
|
+
:ruby
|
2
|
+
name = @resource.invited_by.present? ? @resource.invited_by.name : 'Someone'
|
3
|
+
|
4
|
+
%p
|
5
|
+
= t("devise.mailer.invitation_instructions.hello", email: @resource.name)
|
6
|
+
\!
|
7
|
+
|
8
|
+
%p= t("devise.mailer.invitation_instructions.someone_invited_you", url: integral.backend_dashboard_url, name: name)
|
9
|
+
|
10
|
+
%row
|
11
|
+
%columns{ small: 12 }
|
12
|
+
%spacer{ size: 10 }
|
13
|
+
%center
|
14
|
+
%button{ href: accept_invitation_url(@resource, :invitation_token => @token), class: 'large' }= t("devise.mailer.invitation_instructions.accept")
|
15
|
+
%spacer{ size: 10 }
|
16
|
+
|
17
|
+
- if @resource.invitation_due_at
|
18
|
+
%p= t("devise.mailer.invitation_instructions.accept_until", due_date: l(@resource.invitation_due_at, format: :'devise.mailer.invitation_instructions.accept_until_format'))
|
19
|
+
|
20
|
+
%p= t("devise.mailer.invitation_instructions.ignore").html_safe
|
@@ -3,12 +3,12 @@
|
|
3
3
|
.input-group
|
4
4
|
%span.input-group-label
|
5
5
|
= icon('envelope')
|
6
|
-
= f.input :email, autofocus: true, input_html: { class: 'input-group-field' }, label: false
|
6
|
+
= f.input :email, autofocus: true, input_html: { class: 'input-group-field', value: Rails.env.development? ? Integral::User.first&.email : nil }, label: false
|
7
7
|
|
8
8
|
.input-group
|
9
9
|
%span.input-group-label
|
10
10
|
= icon('key')
|
11
|
-
= f.input :password, input_html: { class: 'input-group-field', 'data-character-counter' => 'false' }, label: false
|
11
|
+
= f.input :password, input_html: { class: 'input-group-field', 'data-character-counter' => 'false', value: Rails.env.development? ? 'password' : nil }, label: false
|
12
12
|
= f.input :remember_me, as: :boolean
|
13
13
|
|
14
14
|
.form-actions
|
@@ -0,0 +1,21 @@
|
|
1
|
+
.timeline-item
|
2
|
+
.timeline-icon
|
3
|
+
= icon(activity.item_icon)
|
4
|
+
.timeline-content
|
5
|
+
.timeline-content-header
|
6
|
+
%p.timeline-content-event= activity.event
|
7
|
+
- if activity.whodunnit.present?
|
8
|
+
= link_to activity.whodunnit_url, class: 'timeline-content-user' do
|
9
|
+
= image_tag activity.whodunnit_avatar_url, class: :avatar
|
10
|
+
%span= activity.whodunnit_name.truncate(30)
|
11
|
+
- else
|
12
|
+
%p.timeline-content-user
|
13
|
+
= image_tag activity.whodunnit_avatar_url, class: :avatar
|
14
|
+
%span= activity.whodunnit_name.truncate(30)
|
15
|
+
%p.timeline-content-date= l(activity.created_at)
|
16
|
+
%p.timeline-content-title
|
17
|
+
= activity.whodunnit_name
|
18
|
+
= activity.event_verb.downcase
|
19
|
+
= link_to activity.item_title, activity.item_url
|
20
|
+
%hr
|
21
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
= link_to t('integral.actions.open_in_new_tab'), backend_resource_url(resource), target: :blank, icon: 'external-link', wrapper: :li
|
@@ -0,0 +1,13 @@
|
|
1
|
+
%td= l(resource.created_at)
|
2
|
+
%td
|
3
|
+
- if resource.whodunnit.present?
|
4
|
+
= link_to backend_user_url(resource.whodunnit.id) do
|
5
|
+
%span.label.clear
|
6
|
+
= image_tag resource.whodunnit.avatar.url(:thumbnail), class: :avatar
|
7
|
+
= resource.whodunnit.name
|
8
|
+
%td
|
9
|
+
%span.label= resource.event
|
10
|
+
%td= resource.item_type.constantize.model_name.human
|
11
|
+
%td
|
12
|
+
= link_to resource.item_url do
|
13
|
+
= resource.item_title
|
@@ -1,15 +1,9 @@
|
|
1
1
|
.card.listing
|
2
|
-
.
|
3
|
-
|
4
|
-
=
|
5
|
-
|
6
|
-
|
2
|
+
.top-bar
|
3
|
+
.top-bar-right
|
4
|
+
= render_resource_grid_form do |f|
|
5
|
+
%li= f.input :user, collection: Integral::User.all.map {|u| [u.name, u.id]}, label: t('integral.records.attributes.user'), wrapper_html: { class: 'filter' }, input_html: { 'data-filter' => true }, required: false
|
6
|
+
%li= f.input :action, collection: Integral::Version.available_actions, label: 'Action', wrapper_html: { class: 'filter' }, input_html: { 'data-filter' => true }, required: false
|
7
|
+
%li= f.input :object, collection: Integral::Version.available_objects, label: 'Object', wrapper_html: { class: 'filter' }, input_html: { 'data-filter' => true }, required: false
|
7
8
|
|
8
|
-
|
9
|
-
.top-bar-right
|
10
|
-
%ul.align-right.menu.filters
|
11
|
-
%li= f.input :user, collection: Integral::User.all.map {|u| [u.name, u.id]}, label: t('integral.records.attributes.user'), wrapper_html: { class: 'filter' }, input_html: { 'data-filter' => true }, required: false
|
12
|
-
%li= f.input :action, collection: Integral::Version.available_actions, label: 'Action', wrapper_html: { class: 'filter' }, input_html: { 'data-filter' => true }, required: false
|
13
|
-
%li= f.input :object, collection: Integral::Version.available_objects, label: 'Object', wrapper_html: { class: 'filter' }, input_html: { 'data-filter' => true }, required: false
|
14
|
-
|
15
|
-
= render_data_grid
|
9
|
+
= render_resource_grid
|
@@ -1,20 +1,36 @@
|
|
1
|
+
- options = { columns: [:date, :user, :action, :actions], order: true }
|
2
|
+
|
1
3
|
= render_data_grid do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
%
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
%
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
4
|
+
%table.integral-grid.wice-grid.table-striped
|
5
|
+
%thead
|
6
|
+
%tr
|
7
|
+
- grid.html_columns(*options[:columns]).uniq { |col| col.name }.sort_by{ |item| options[:columns].index item.name }.each do |column|
|
8
|
+
%th{ class: datagrid_column_classes(grid, column) }
|
9
|
+
- if column.supports_order? && options[:order]
|
10
|
+
%button{ data: { sort: column.name, desc: (!grid.descending).to_s }}
|
11
|
+
= column.header
|
12
|
+
- else
|
13
|
+
= column.header
|
14
|
+
%tbody
|
15
|
+
- if grid.assets.any?
|
16
|
+
- grid.assets.decorate.each do |activity|
|
17
|
+
%tr
|
18
|
+
%td= l(activity.created_at)
|
19
|
+
%td
|
20
|
+
- if activity.whodunnit.present?
|
21
|
+
= link_to backend_user_url(activity.whodunnit.id) do
|
22
|
+
%span.label.clear
|
23
|
+
= image_tag activity.whodunnit.avatar.url(:thumbnail), class: :avatar
|
24
|
+
= activity.whodunnit.name
|
25
|
+
%td
|
26
|
+
%span.label= activity.event
|
27
|
+
-# Currently not possible to show this as changeset isn't available in the query resultset for performance reasons - One possible solution would be to create a Grid class for each Version - rather than unioning all the tables it only includes it's own
|
28
|
+
-# %td= activity.attributes_changed
|
29
|
+
%td.actions
|
30
|
+
= link_to activity.url do
|
31
|
+
= icon('eye')
|
32
|
+
- else
|
33
|
+
= render partial: 'integral/backend/shared/grid/empty'
|
34
|
+
|
35
|
+
= render partial: 'integral/backend/shared/grid/pagination', locals: { records: grid.assets }
|
36
|
+
= icon('spinner', class: 'fa-pulse fa-3x fa-fw load-indicator')
|