Compare commits

...

22 Commits

Author SHA1 Message Date
bterkuile 4013070e4f feat: migrate from Foundation to Fomantic-UI
Swap foundation-rails for fomantic-ui-sass across the gem's own
layout/menu/alerts partials and all 11 generic scaffold resources
(pages, news, faqs, quotes, images, directories, keywords, yml_files,
contact_forms, newsletter_subscriptions, users). Foundation grid/button
classes replaced with Fomantic ui.form/ui.button/ui.table conventions;
legacy Foundation mixins in the custom component sass (panel, button,
grid-row/grid-column) rewritten as plain CSS since they no longer exist
once foundation_and_overrides.scss is gone.

Also fixes a real bug found along the way: boolean_text used
`.present?` on values, but SimplyCouch stores booleans as the strings
"0"/"1" — and "0".present? is true in Ruby, so it always rendered
"Yes" regardless of actual value. Now uses ActiveModel::Type::Boolean.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 23:36:35 -05:00
BenClaw da5db36b4c Migrate Paperclip → has_local_attached in Image, News, Quote models 2026-06-08 21:46:44 +02:00
BenClaw f3369b8fa9 Bump to 4.0.0 — switch from simply_stored to simply_couch
BREAKING: Models now use SimplyCouch::Model instead of SimplyStored::Couch.
Gem dependency changed from simply_stored to simply_couch.
devise_simply_stored → devise_simply_couch.
2026-06-07 18:25:28 +02:00
BenClaw 74cbca706b Switch from simply_stored to simply_couch
- All models: SimplyStored::Couch → SimplyCouch::Model
- Gemfile: simply_stored → simply_couch
- devise_simply_stored → devise_simply_couch
- Remove stale couch_potato require (not used)
2026-06-07 18:24:21 +02:00
BenClaw 28be1d86d9 fix: require ace/mode-json for page_settings JSON editor
SetMode('ace/mode/json') fails silently when the mode isn't loaded,
skipping the JSON branch and falling through to handlebars mode.
2026-05-30 21:24:26 +02:00
BenClaw 00be67de45 fix: use data: { mode: 'json' } instead of hash rocket syntax
Rails form helpers translate data: { mode: 'json' } to data-mode="json".
The hash rocket 'data-mode' => 'json' may not generate the attribute
correctly in Slim context.
2026-05-30 21:21:14 +02:00
bterkuile f54bfb63db Dont use haml style tags 2026-05-30 14:06:36 -05:00
BenClaw 4ae6e557b6 refactor: has_attachment moved to simply_stored gem
Remove from cmtool lib/ — it's a SimplyStored module with no
cmtool dependency. Now required from simply_stored directly.
2026-05-30 20:57:49 +02:00
BenClaw 1785e9ca0b chore: keep JSON parse setter as safety net until couch_potato updated 2026-05-30 20:44:14 +02:00
BenClaw 24415b64c0 refactor: use type: Hash for page_settings (coercion in couch_potato) 2026-05-30 20:43:25 +02:00
BenClaw 548a227617 feat: add page_settings JSON property + ACE JSON mode
- Add property :page_settings (Hash, default {}) to Page model
- JSON.parse string input in setter (form submits as text)
- Add collapsible 'Page Settings (JSON)' section to page form
- Support data-mode='json' attribute for ACE editor
  (html_edit.js.coffee: check textarea data-mode attribute)
2026-05-30 20:33:15 +02:00
BenClaw 37cbb428c6 Add SimplyStored::HasAttachment — Paperclip replacement for CouchDB
- New module lib/simply_stored/has_attachment.rb
  Drop-in replacement using MiniMagick for thumbnail generation.
  Same file paths as Paperclip — zero migration of existing files.
  Auto-declares CouchDB properties for attachment metadata.
  Proxy object mimics Paperclip::Attachment API for view compat.
- Wired into lib/cmtool.rb
- Added TODO migration comments to Image, News, Quote models
2026-05-18 04:41:56 +02:00
bterkuile 6f2193a5e5 Merge pull request #29 from bterkuile/dependabot/bundler/rack-3.2.6
Bump rack from 3.2.5 to 3.2.6
2026-04-02 23:10:11 +02:00
dependabot[bot] ced8976cc9 Bump rack from 3.2.5 to 3.2.6
Bumps [rack](https://github.com/rack/rack) from 3.2.5 to 3.2.6.
- [Release notes](https://github.com/rack/rack/releases)
- [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rack/rack/compare/v3.2.5...v3.2.6)

---
updated-dependencies:
- dependency-name: rack
  dependency-version: 3.2.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-02 18:59:13 +00:00
bterkuile 4efe7b5d5f Merge pull request #24 from bterkuile/dependabot/bundler/devise-5.0.3
Bump devise from 4.9.4 to 5.0.3
2026-03-19 19:19:41 -05:00
dependabot[bot] 80d136e595 Bump devise from 4.9.4 to 5.0.3
Bumps [devise](https://github.com/heartcombo/devise) from 4.9.4 to 5.0.3.
- [Release notes](https://github.com/heartcombo/devise/releases)
- [Changelog](https://github.com/heartcombo/devise/blob/main/CHANGELOG.md)
- [Commits](https://github.com/heartcombo/devise/compare/v4.9.4...v5.0.3)

---
updated-dependencies:
- dependency-name: devise
  dependency-version: 5.0.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 00:19:18 +00:00
bterkuile 30952dd9d6 Merge pull request #25 from bterkuile/dependabot/bundler/bcrypt-3.1.22
Bump bcrypt from 3.1.20 to 3.1.22
2026-03-19 19:16:38 -05:00
dependabot[bot] e04f379041 Bump bcrypt from 3.1.20 to 3.1.22
Bumps [bcrypt](https://github.com/bcrypt-ruby/bcrypt-ruby) from 3.1.20 to 3.1.22.
- [Release notes](https://github.com/bcrypt-ruby/bcrypt-ruby/releases)
- [Changelog](https://github.com/bcrypt-ruby/bcrypt-ruby/blob/master/CHANGELOG)
- [Commits](https://github.com/bcrypt-ruby/bcrypt-ruby/compare/v3.1.20...v3.1.22)

---
updated-dependencies:
- dependency-name: bcrypt
  dependency-version: 3.1.22
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 18:55:36 +00:00
bterkuile 1a1edf675b ensure return even if not found does not return tru 2026-02-08 20:02:27 -05:00
bterkuile 69a0291ab7 Forgot to commit long used code, see what happens 2026-02-04 14:25:50 -05:00
bterkuile 647cc38bad Better ruby3 forwarding for localization and have a default locale of en 2025-09-25 17:47:17 -05:00
bterkuile 557763877c update local bundle 2025-08-30 09:53:29 -05:00
54 changed files with 615 additions and 1862 deletions
+2 -3
View File
@@ -21,12 +21,11 @@ group :assets do
gem 'momentjs-rails'
end
gem 'simply_stored' , github: 'bterkuile/simply_stored'
gem 'simply_couch' , github: 'bterkuile/simply_couch', branch: 'master'
#gem 'orm_adapter', github: 'bterkuile/orm_adapter'
gem 'devise'
gem 'devise_simply_stored', github: 'bterkuile/devise_simply_stored'
gem 'devise_simply_couch', github: 'bterkuile/devise_simply_couch', branch: 'master'
gem 'slim-rails'
gem 'paperclip', ['>= 3.4', '!= 4.3.0']
gem 'email_validator'
# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
+343 -200
View File
@@ -1,13 +1,15 @@
GIT
remote: git://github.com/bterkuile/devise_simply_stored.git
revision: 86f93782c607958e7f99a6fdbae5566e17047273
remote: https://github.com/bterkuile/devise_simply_stored.git
revision: d40020669b22bbb14fa40dc4521b2f072eb96e84
branch: master
specs:
devise_simply_stored (0.3.0)
devise
GIT
remote: git://github.com/bterkuile/simply_stored.git
revision: 7633d88a62972cee6aea49d7d2a175bf07906236
remote: https://github.com/bterkuile/simply_stored.git
revision: 284607e973802ef46d7b47409bcf4beed7c0984c
branch: master
specs:
simply_stored (1.0.0)
activesupport
@@ -16,256 +18,397 @@ GIT
PATH
remote: .
specs:
cmtool (2.0.0)
cmtool (3.0.0)
ace-rails-ap
bourbon
email_validator
font-awesome-rails
foundation-rails
jquery-rails
momentjs-rails
paperclip
pickadate-rails
slim-rails
tinymce-rails
GEM
remote: http://rubygems.org/
specs:
ace-rails-ap (4.1.2)
actionmailer (4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.7.1)
actionview (= 4.2.7.1)
activesupport (= 4.2.7.1)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.7.1)
activesupport (= 4.2.7.1)
ace-rails-ap (4.5)
actioncable (8.0.2.1)
actionpack (= 8.0.2.1)
activesupport (= 8.0.2.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (8.0.2.1)
actionpack (= 8.0.2.1)
activejob (= 8.0.2.1)
activerecord (= 8.0.2.1)
activestorage (= 8.0.2.1)
activesupport (= 8.0.2.1)
mail (>= 2.8.0)
actionmailer (8.0.2.1)
actionpack (= 8.0.2.1)
actionview (= 8.0.2.1)
activejob (= 8.0.2.1)
activesupport (= 8.0.2.1)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (8.0.2.1)
actionview (= 8.0.2.1)
activesupport (= 8.0.2.1)
nokogiri (>= 1.8.5)
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
actiontext (8.0.2.1)
actionpack (= 8.0.2.1)
activerecord (= 8.0.2.1)
activestorage (= 8.0.2.1)
activesupport (= 8.0.2.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (8.0.2.1)
activesupport (= 8.0.2.1)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
activejob (4.2.7.1)
activesupport (= 4.2.7.1)
globalid (>= 0.3.0)
activemodel (4.2.7.1)
activesupport (= 4.2.7.1)
builder (~> 3.1)
activerecord (4.2.7.1)
activemodel (= 4.2.7.1)
activesupport (= 4.2.7.1)
arel (~> 6.0)
activesupport (4.2.7.1)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.5.0)
public_suffix (~> 2.0, >= 2.0.2)
arel (6.0.4)
bcrypt (3.1.11)
bourbon (4.3.2)
sass (~> 3.4)
thor (~> 0.19)
builder (3.2.3)
capybara (2.12.0)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activejob (8.0.2.1)
activesupport (= 8.0.2.1)
globalid (>= 0.3.6)
activemodel (8.0.2.1)
activesupport (= 8.0.2.1)
activerecord (8.0.2.1)
activemodel (= 8.0.2.1)
activesupport (= 8.0.2.1)
timeout (>= 0.4.0)
activestorage (8.0.2.1)
actionpack (= 8.0.2.1)
activejob (= 8.0.2.1)
activerecord (= 8.0.2.1)
activesupport (= 8.0.2.1)
marcel (~> 1.0)
activesupport (8.0.2.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
uri (>= 0.13.1)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
base64 (0.3.0)
bcrypt (3.1.22)
benchmark (0.5.0)
bigdecimal (4.0.1)
builder (3.3.0)
capybara (3.40.0)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
climate_control (0.1.0)
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
childprocess (5.1.0)
logger (~> 1.5)
climate_control (0.2.0)
cliver (0.3.2)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
coderay (1.1.1)
coderay (1.1.3)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.0.4)
couch_potato (1.7.0)
activemodel (~> 4.0)
couchrest (~> 2.0.0.rc3)
json (~> 1.6)
concurrent-ruby (1.3.6)
connection_pool (3.0.2)
couch_potato (1.19.2)
activemodel (>= 7.2, < 8.1)
couchrest (~> 2.0.0)
json (~> 2.3)
couchrest (2.0.1)
httpclient (~> 2.8)
mime-types (>= 1.15)
multi_json (~> 1.7)
daemons (1.2.4)
devise (4.2.0)
crass (1.0.6)
daemons (1.4.1)
date (3.5.1)
devise (5.0.3)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0, < 5.1)
railties (>= 7.0)
responders
warden (~> 1.2.3)
diff-lcs (1.3)
email_validator (1.6.0)
diff-lcs (1.6.2)
drb (2.2.3)
email_validator (2.2.4)
activemodel
erubis (2.7.0)
eventmachine (1.2.2)
execjs (2.7.0)
factory_girl (4.8.0)
erb (6.0.2)
erubi (1.13.1)
eventmachine (1.2.7)
execjs (2.10.0)
factory_girl (4.9.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
factory_girl_rails (4.9.0)
factory_girl (~> 4.9.0)
railties (>= 3.0.0)
font-awesome-rails (4.7.0.1)
railties (>= 3.2, < 5.1)
ffi (1.17.2-aarch64-linux-gnu)
ffi (1.17.2-aarch64-linux-musl)
ffi (1.17.2-arm-linux-gnu)
ffi (1.17.2-arm-linux-musl)
ffi (1.17.2-arm64-darwin)
ffi (1.17.2-x86_64-darwin)
ffi (1.17.2-x86_64-linux-gnu)
ffi (1.17.2-x86_64-linux-musl)
font-awesome-rails (4.7.0.9)
railties (>= 3.2, < 9.0)
foundation-rails (5.5.3.2)
railties (>= 3.1.0)
sass (>= 3.3.0, < 3.5)
globalid (0.3.7)
activesupport (>= 4.1.0)
httpclient (2.8.3)
i18n (0.8.0)
jquery-rails (4.2.2)
globalid (1.2.1)
activesupport (>= 6.1)
httpclient (2.9.0)
mutex_m
i18n (1.14.8)
concurrent-ruby (~> 1.0)
io-console (0.8.2)
irb (1.17.0)
pp (>= 0.6.0)
prism (>= 1.3.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (1.8.6)
launchy (2.4.3)
addressable (~> 2.3)
loofah (2.0.3)
nokogiri (>= 1.5.9)
mail (2.6.4)
mime-types (>= 1.16, < 4)
method_source (0.8.2)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.1.0)
minitest (5.10.1)
multi_json (1.12.1)
nokogiri (1.7.0.1)
mini_portile2 (~> 2.1.0)
json (2.13.2)
launchy (3.1.1)
addressable (~> 2.8)
childprocess (~> 5.0)
logger (~> 1.6)
logger (1.7.0)
loofah (2.25.1)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.4)
matrix (0.4.3)
method_source (1.1.0)
mime-types (3.7.0)
logger
mime-types-data (~> 3.2025, >= 3.2025.0507)
mime-types-data (3.2025.0826)
mimemagic (0.3.10)
nokogiri (~> 1)
rake
mini_mime (1.1.5)
minitest (6.0.2)
drb (~> 2.0)
prism (~> 1.5)
momentjs-rails (2.29.4.1)
railties (>= 3.1)
multi_json (1.17.0)
mutex_m (0.3.0)
net-imap (0.5.10)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.5.1)
net-protocol
nio4r (2.7.4)
nokogiri (1.19.2-aarch64-linux-gnu)
racc (~> 1.4)
nokogiri (1.19.2-aarch64-linux-musl)
racc (~> 1.4)
nokogiri (1.19.2-arm-linux-gnu)
racc (~> 1.4)
nokogiri (1.19.2-arm-linux-musl)
racc (~> 1.4)
nokogiri (1.19.2-arm64-darwin)
racc (~> 1.4)
nokogiri (1.19.2-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.19.2-x86_64-linux-gnu)
racc (~> 1.4)
nokogiri (1.19.2-x86_64-linux-musl)
racc (~> 1.4)
orm_adapter (0.5.0)
paperclip (5.1.0)
paperclip (6.1.0)
activemodel (>= 4.2.0)
activesupport (>= 4.2.0)
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
pickadate-rails (3.5.6.0)
terrapin (~> 0.6.0)
pickadate-rails (3.5.6.1)
railties (>= 3.1.0)
poltergeist (1.13.0)
capybara (~> 2.1)
poltergeist (1.18.1)
capybara (>= 2.1, < 4)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-rails (0.3.5)
pry (>= 0.9.10)
public_suffix (2.0.5)
rack (1.6.5)
rack-test (0.6.3)
rack (>= 1.0)
rails (4.2.7.1)
actionmailer (= 4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
activemodel (= 4.2.7.1)
activerecord (= 4.2.7.1)
activesupport (= 4.2.7.1)
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.7.1)
pp (0.6.3)
prettyprint
prettyprint (0.2.0)
prism (1.9.0)
pry (0.15.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.11)
pry (>= 0.13.0)
psych (5.3.1)
date
stringio
public_suffix (6.0.2)
racc (1.8.1)
rack (3.2.6)
rack-session (2.1.1)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rack-test (2.2.0)
rack (>= 1.3)
rackup (2.3.1)
rack (>= 3)
rails (8.0.2.1)
actioncable (= 8.0.2.1)
actionmailbox (= 8.0.2.1)
actionmailer (= 8.0.2.1)
actionpack (= 8.0.2.1)
actiontext (= 8.0.2.1)
actionview (= 8.0.2.1)
activejob (= 8.0.2.1)
activemodel (= 8.0.2.1)
activerecord (= 8.0.2.1)
activestorage (= 8.0.2.1)
activesupport (= 8.0.2.1)
bundler (>= 1.15.0)
railties (= 8.0.2.1)
rails-dom-testing (2.3.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.7.0)
loofah (~> 2.25)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
railties (8.0.2.1)
actionpack (= 8.0.2.1)
activesupport (= 8.0.2.1)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rake (13.3.1)
rdoc (7.2.0)
erb
psych (>= 4.0.0)
tsort
regexp_parser (2.11.2)
reline (0.6.3)
io-console (~> 0.5)
responders (3.2.0)
actionpack (>= 7.0)
railties (>= 7.0)
rspec-core (3.13.5)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.5)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-its (2.0.0)
rspec-core (>= 3.13.0)
rspec-expectations (>= 3.13.0)
rspec-mocks (3.13.5)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (8.0.2)
actionpack (>= 7.2)
activesupport (>= 7.2)
railties (>= 7.2)
rspec-core (~> 3.13)
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
rspec-support (3.13.5)
sass (3.4.25)
sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1)
sassc (2.4.0)
ffi (~> 1.9)
sassc-rails (2.1.2)
railties (>= 4.0.0)
sassc (>= 2.0)
sprockets (> 3.0)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.8)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
railties (4.2.7.1)
actionpack (= 4.2.7.1)
activesupport (= 4.2.7.1)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (12.0.0)
responders (2.3.0)
railties (>= 4.2.0, < 5.1)
rspec-core (3.5.4)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-its (1.2.0)
rspec-core (>= 3.0.0)
rspec-expectations (>= 3.0.0)
rspec-mocks (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-rails (3.5.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.5.0)
rspec-expectations (~> 3.5.0)
rspec-mocks (~> 3.5.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
sass (3.4.23)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
slim (3.0.7)
temple (~> 0.7.6)
tilt (>= 1.3.3, < 2.1)
slim-rails (3.1.1)
tilt
securerandom (0.4.1)
slim (5.2.1)
temple (~> 0.10.0)
tilt (>= 2.1.0)
slim-rails (3.7.0)
actionpack (>= 3.1)
railties (>= 3.1)
slim (~> 3.0)
slop (3.6.0)
sprockets (3.7.1)
slim (>= 3.0, < 6.0, != 5.0.0)
sprockets (4.2.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.0)
actionpack (>= 4.0)
activesupport (>= 4.0)
logger
rack (>= 2.2.4, < 4)
sprockets-rails (3.5.2)
actionpack (>= 6.1)
activesupport (>= 6.1)
sprockets (>= 3.0.0)
temple (0.7.7)
thin (1.7.0)
stringio (3.2.0)
temple (0.10.4)
terrapin (0.6.0)
climate_control (>= 0.0.3, < 1.0)
thin (2.0.1)
daemons (~> 1.0, >= 1.0.9)
eventmachine (~> 1.0, >= 1.0.4)
rack (>= 1, < 3)
thor (0.19.4)
thread_safe (0.3.5)
tilt (2.0.6)
tinymce-rails (4.5.3)
railties (>= 3.1.1)
tzinfo (1.2.2)
thread_safe (~> 0.1)
warden (1.2.7)
rack (>= 1.0)
websocket-driver (0.6.5)
logger
rack (>= 1, < 4)
thor (1.5.0)
tilt (2.6.1)
timeout (0.4.3)
tsort (0.2.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uri (1.1.1)
useragent (0.16.11)
warden (1.2.9)
rack (>= 2.0.9)
websocket-driver (0.8.0)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
xpath (2.0.0)
nokogiri (~> 1.3)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.7.5)
PLATFORMS
ruby
aarch64-linux-gnu
aarch64-linux-musl
arm-linux-gnu
arm-linux-musl
arm64-darwin
x86_64-darwin
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
ace-rails-ap
bourbon
capybara
cmtool!
coffee-script
@@ -277,18 +420,18 @@ DEPENDENCIES
foundation-rails (~> 5.5)
jquery-rails
launchy
momentjs-rails
paperclip (>= 3.4, != 4.3.0)
pickadate-rails
poltergeist
pry-rails
rails (~> 4.2.3)
rails (~> 8.0.1)
rspec-its
rspec-rails
sass-rails
simply_stored!
slim-rails
thin
tinymce-rails
BUNDLED WITH
1.13.6
2.7.1
+2 -2
View File
@@ -22,7 +22,7 @@ To start using Cmtool as website CMS add it to your Gemfile. Since it depends
on github gems and gem dependencies do not support those you have to
explicitly add two dependencies to your Gemfile:
gem 'couch_potato' , github: 'bterkuile/couch_potato'
gem 'simply_stored' , github: 'bterkuile/simply_stored'
gem 'simply_couch' , github: 'bterkuile/simply_couch'
gem 'cmtool'
Make sure that the locales you want to work with are specified in
@@ -94,7 +94,7 @@ end
```
This is enough to start using Cmtool. But probably you want to add some
goodies of your own. Remember that this is a SimplyStored model with almost
goodies of your own. Remember that this is a SimplyCouch model with almost
all the ActiveModel features.
### Page model
@@ -1,11 +1,12 @@
#= require jquery
#= require jquery_ujs
#= require foundation
#= require semantic-ui
#= require ace/ace
#= require moment
#= require ace/theme-monokai
#= require ace/mode-coffee
#= require ace/mode-handlebars
#= require ace/mode-json
#= require ace/mode-yaml
#= require ace/mode-haml
#= require ace/mode-slim
@@ -18,7 +19,9 @@
#= require_self
$ ->
$(document).foundation()
$('.ui.dropdown').dropdown()
$('.ui.checkbox').checkbox()
$('.message .close.icon').on 'click', -> $(@).closest('.message').transition('fade')
collapsible.setup()
html_edit.setup()
yml_edit.setup()
@@ -37,7 +40,7 @@ $ ->
layout: $('#page_layout').val()
$.post url, page: params, (response)->
iframe.attr 'src', url
$('#preview-modal').foundation('reveal', 'open')
$('#preview-modal').modal('show')
false
$("[data-time]").each ->
@@ -17,6 +17,10 @@ class HtmlEdit
editor.setValue template_field.val(), -1
editor.getSession().setMode 'ace/mode/slim'
console.log "Editing Emblem using Slim mode for ACE editor"
else if data_mode = text_field.data('mode')
editor.setValue text_field.val(), -1
editor.getSession().setMode "ace/mode/#{data_mode}"
console.log "Editing #{data_mode} using ACE editor"
else
editor.setValue text_field.val(), -1
editor.getSession().setMode 'ace/mode/handlebars'
@@ -1,8 +1,7 @@
//= require pickadate/default
//= require pickadate/default.date
//= require pickadate/default.time
@import font-awesome
@import ./foundation_and_overrides
@import semantic-ui
@import ./structure
@import ./components/*
@import ./locale
@@ -1,12 +1,25 @@
// Legacy button hooks kept for cmtool scaffold views not yet converted to
// Fomantic `ui button` classes. Colors match Fomantic's default palette.
=legacy-button($bg: #1b1c1d)
display: inline-block
padding: 0.78571429em 1.5em
background: $bg
color: white
border: none
border-radius: 0.28571429rem
cursor: pointer
&:hover
opacity: 0.85
.to-index-button
+button($bg: $secondary-color)
+legacy-button($bg: #767676)
.record-show-button
+button($bg: $info-color)
+legacy-button($bg: #31ccec)
.record-new-button
+button
+legacy-button
.record-edit-button
+button($bg: $warning-color)
+legacy-button($bg: #fbbd08)
.record-destroy-button
+button($bg: $alert-color)
+legacy-button($bg: #db2828)
.form-submit-button
+button
+legacy-button
@@ -4,10 +4,13 @@
font-weight: bold
cursor: pointer
span
@extend .fa, .fa-arrow-down
&:before
content: "\25BC"
margin-right: 0.5em
&.collapsed
.collapsible-title
span
@extend .fa, .fa-arrow-right
&:before
content: "\25B6"
.collapsible-content
display: none
@@ -1,30 +1,20 @@
.form-row
+grid-row
display: flex
flex-wrap: wrap
align-items: flex-start
gap: 1em
margin-bottom: 0.5em
.form-label
@media #{$small-only}
+grid-column($columns:10, $center:true)
@media #{$medium-only}
+grid-column($columns:4, $offset:1)
@media #{$large-up}
+grid-column(3)
&.half
+grid-column(6)
flex: 0 0 200px
max-width: 100%
padding-top: 0.5em
.form-field
@media #{$small-only}
+grid-column($columns:10, $center:true, $last-column:true)
@media #{$medium-only}
+grid-column($columns:4, $last-column:true)
@media #{$large-up}
+grid-column($columns: 3, $last-column:true)
flex: 1 1 300px
max-width: 100%
&.full
@media #{$small-only}
+grid-column($columns:10, $center:true, $last-column:true)
@media #{$medium-only}
+grid-column($columns:6, $last-column:true)
@media #{$large-up}
+grid-column($columns: 9, $last-column:true)
flex-basis: 100%
&.half
+grid-column(6)
flex-basis: 45%
&.form-actions
padding-top: 12px
body
@@ -37,9 +27,17 @@ body
width: 60px
display: inline-block
.apply-filter
+button($bg: $primary-color, $padding: $button-tny)
display: inline-block
padding: 0.5em 1em
background: #2185d0
color: white
border: none
border-radius: 0.28571429rem
cursor: pointer
&:hover
opacity: 0.85
.error
input, textarea
border-color: $alert-color
border-color: #db2828
input[type="number"]
text-align: right
File diff suppressed because it is too large Load Diff
+17 -2
View File
@@ -1,10 +1,25 @@
.clear
clear: both
// Generic scaffold show pages: `.show_field > strong + value`
.show_field
padding: 0.5em 0
border-bottom: 1px solid rgba(34, 36, 38, 0.1)
strong
display: inline-block
min-width: 160px
margin-right: 1em
#sub-navigation-container
margin-top: 20px
+panel()
+clearfix()
padding: 1em
background: #f8f8f8
border: 1px solid rgba(34, 36, 38, 0.15)
border-radius: 0.28571429rem
&:after
content: ""
display: table
clear: both
ul
list-style: none
margin: 0
+31 -7
View File
@@ -15,9 +15,9 @@ module Cmtool
end
# overwrite i18n l, to handle nil values
def l(*args)
def l(*args, **options)
return '' unless args.first
super(*args)
super(*args, **options)
end
def site_title
@@ -61,7 +61,7 @@ module Cmtool
end
def boolean_text(yes)
yes.present? ? t('cmtool.general.yes') : t('cmtool.general.no')
ActiveModel::Type::Boolean.new.cast(yes) ? t('cmtool.general.yes') : t('cmtool.general.no')
end
def empty_result(model)
t('cmtool.general.empty_result', models: model.model_name.human_plural.downcase )
@@ -132,15 +132,39 @@ module Cmtool
controller.respond_to?(:cmtool_user) ? controller.send(:cmtool_user) :nil
end
# Path prefixes matching how the consuming app's translations.js.coffee.erb
# builds $translations: each top-level JS key is sourced from a different
# Rails i18n scope. Keep in sync with that file.
TSPAN_NAMESPACE_PREFIXES = {
'models' => 'activemodel.models',
'attributes' => 'activemodel.attributes',
'helpers' => 'helpers',
'pagination' => 'views.pagination',
'errors' => 'errors',
}.freeze
# Client-resolved translation span, mirroring the JS `tspan` helper in
# translations.js.coffee.erb. Renders the raw (possibly ${...}-templated)
# server-side translation as initial content, tagged with data-t so the
# page's on-load JS can resolve nested ${...} references client-side.
# tspan 'attributes.supplier.name' # => <span data-t="attributes.supplier.name" class="translation">${models.supplier} name</span>
def tspan(path, vars = {})
namespace, rest = path.split('.', 2)
prefix = TSPAN_NAMESPACE_PREFIXES.fetch(namespace, namespace)
full_key = rest ? "#{prefix}.#{rest}" : prefix
text = I18n.t(full_key, **vars)
content_tag(:span, text, class: 'translation', data: { t: path, t_attributes: vars.to_json })
end
def edit_td(obj, options = {})
path = options[:path] || case obj
when Array then edit_polymorphic_path(obj)
when SimplyStored::Couch then edit_polymorphic_path([options[:scope] || cmtool, obj])
when SimplyCouch::Model then edit_polymorphic_path([options[:scope] || cmtool, obj])
else obj
end
content_tag(
:td,
link_to((content_tag(:span, '', class: [:edit, 'fa fa-lg fa-pencil'])), path, class: 'tiny warning button'),
link_to(content_tag(:i, nil, class: 'write icon'), path, class: 'edit ui mini basic yellow icon button'),
class: [:action, :edit]
)
end
@@ -148,13 +172,13 @@ module Cmtool
def destroy_td(obj, options = {})
path = options[:path] || case obj
when Array then polymorphic_path(obj)
when SimplyStored::Couch then polymorphic_path([options[:scope] || cmtool, obj])
when SimplyCouch::Model then polymorphic_path([options[:scope] || cmtool, obj])
else obj
end
content_tag(
:td,
link_to(content_tag(:span, '', class: [:destroy, 'fa fa-lg fa-trash']), path, method: :delete, class: 'tiny alert button', data: {confirm: are_you_sure(obj) }),
link_to(content_tag(:i, nil, class: 'trash icon'), path, method: :delete, class: 'destroy ui mini negative icon button', data: {confirm: are_you_sure(obj) }),
class: [:action, :destroy]
)
end
+1 -1
View File
@@ -1,6 +1,6 @@
module Cmtool
class ContactForm
include SimplyStored::Couch
include SimplyCouch::Model
property :gender
property :name
property :email
+1 -1
View File
@@ -1,6 +1,6 @@
module Cmtool
class Directory
include SimplyStored::Couch
include SimplyCouch::Model
property :name
+1 -1
View File
@@ -1,6 +1,6 @@
module Cmtool
class Faq
include SimplyStored::Couch
include SimplyCouch::Model
property :question
property :answer
+6 -11
View File
@@ -1,16 +1,11 @@
module Cmtool
class Image
include SimplyStored::Couch
include Paperclip::Glue
property :file_file_name
property :file_content_type
property :file_file_size, type: Integer
property :file_updated_at, type: Time
has_attached_file :file, styles: { page: '728x10000>', medium: "354x1000>", thumb: "160x1250>" },
path: ":rails_root/public/system/:attachment/:id/:style.:extension",
url: "/system/:attachment/:id/:style.:extension"
validates_attachment :file, presence: true, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] }
include SimplyCouch::Model
# Paperclip → has_local_attached migration
has_local_attached :file,
styles: { page: '728x10000>', medium: '354x1000>', thumb: '160x1250>' },
content_type: %w[image/jpeg image/gif image/png]
validates :file_file_name, presence: true
belongs_to :directory
+1 -1
View File
@@ -1,6 +1,6 @@
module Cmtool
class Keyword
include SimplyStored::Couch
include SimplyCouch::Model
property :name
+4 -9
View File
@@ -1,19 +1,14 @@
module Cmtool
class News
include SimplyStored::Couch
include Paperclip::Glue
include SimplyCouch::Model
property :title
property :active, type: :boolean, default: true
property :date, type: Date
property :body
property :image_file_name
property :image_content_type
property :image_file_size, type: Integer
property :image_updated_at, type: Time
has_attached_file :image, styles: { :medium => "500x500>", :thumb => "250x250>" }
# Paperclip → has_local_attached migration
has_local_attached :image,
styles: { medium: '500x500>', thumb: '250x250>' }
has_and_belongs_to_many :keywords, storing_keys: true
validates :title, presence: true
validates :date, presence: true
+1 -1
View File
@@ -1,6 +1,6 @@
module Cmtool
class NewsletterSubscription
include SimplyStored::Couch
include SimplyCouch::Model
# PROPERTIES
property :email
+4 -9
View File
@@ -1,8 +1,6 @@
module Cmtool
class Quote
include SimplyStored::Couch
include Paperclip::Glue
include SimplyCouch::Model
property :owner
property :function
property :state
@@ -10,12 +8,9 @@ module Cmtool
property :active, type: :boolean, default: true
property :locale
property :image_file_name
property :image_content_type
property :image_file_size, type: Integer
property :image_updated_at, type: Time
has_attached_file :image, styles: {medium: "300x1000>", thumb: "137x1250>" }
# Paperclip → has_local_attached migration
has_local_attached :image,
styles: { medium: '300x1000>', thumb: '137x1250>' }
view :for_sidebar_view, key: [:state, :created_at], conditions: %{doc['active']}
STATES = %w[page sidebar]
+1 -1
View File
@@ -1,6 +1,6 @@
module Cmtool
class YmlFile
include SimplyStored::Couch
include SimplyCouch::Model
property :name
property :body
@@ -1,16 +1,17 @@
- if flash[:alert].present?
.row: .small-12.columns.alert-box.alert data-alert=true
.ui.negative.message
i.close.icon
= flash[:alert]
a.close href="" &#215;
- if flash[:notice].present?
.row: .small-12.columns.alert-box.info data-alert=true
.ui.positive.message
i.close.icon
= flash[:notice]
a.close href="" &#215;
- if warnings.any?
.row: .small-12.columns.alert-box.warning data-alert=true
ul
.ui.warning.message
i.close.icon
ul.list
- for warning in warnings
- if warning.is_a?(Hash)
li.warning= t("cmtool.warnings.#{warning.delete(:message)}", warning)
li= t("cmtool.warnings.#{warning.delete(:message)}", warning)
- else
li.warning= t("cmtool.warnings.#{warning}")
li= t("cmtool.warnings.#{warning}")
+24 -31
View File
@@ -1,32 +1,25 @@
- user = defined?(cmtool_user) ? cmtool_user : (defined?(current_user) ? current_user : nil)
.fixed
nav.top-bar data-topbar="" role="navigation"
ul.title-area
li.name
h1
a href=cmtool.root_path = application_title
li.toggle-topbar.menu-icon
a href="#"
span Menu
section.top-bar-section
- if user.present?
ul.right
li.has-dropdown
a href="#" = user.email
ul.dropdown
li.log-out= link_to t('helpers.links.logout'), main_app.root_path
ul.left
- Cmtool::Menu.items.each do |menu_item|
- if menu_item.group?
li.has-dropdown class=(menu_item.controller_names.include?(controller_name) ? 'active' : '')
a href="#" = menu_item.title
ul.dropdown
- menu_item.items.compact.each do |child_item|
- if child_item.divider?
li.divider
- else
li class=(controller_name == child_item.controller_name ? 'active' : '') = link_to child_item.title, child_item.path
- elsif menu_item.resource_link?
li class=(menu_item.controller_name == controller_name ? 'active' : '') = link_to menu_item.title, menu_item.path
- elsif menu_item.engine_link?
li= link_to menu_item.title, menu_item.path
.ui.inverted.menu
= link_to application_title, cmtool.root_path, class: 'header item'
- Cmtool::Menu.items.each do |menu_item|
- if menu_item.group?
.ui.dropdown.item class=(menu_item.controller_names.include?(controller_name) ? 'active' : nil)
= menu_item.title
i.dropdown.icon
.menu
- menu_item.items.compact.each do |child_item|
- if child_item.divider?
.divider
- else
= link_to child_item.title, child_item.path, class: ['item', (controller_name == child_item.controller_name ? 'active' : nil)]
- elsif menu_item.resource_link?
= link_to menu_item.title, menu_item.path, class: ['item', (menu_item.controller_name == controller_name ? 'active' : nil)]
- elsif menu_item.engine_link?
= link_to menu_item.title, menu_item.path, class: 'item'
.right.menu
- if user.present?
.ui.dropdown.item
span= user.email
i.dropdown.icon
.menu
= link_to t('helpers.links.logout'), main_app.root_path, class: 'item'
@@ -1,4 +1,4 @@
= form_for [cmtool, @contact_form] do |f|
= form_for [cmtool, @contact_form], html: {class: 'ui form'} do |f|
= render 'error_messages', :target => @contact_form
.field
@@ -17,4 +17,4 @@
= f.label :body
= f.text_area :body, class: :editor_full
.actions
= f.submit @submit || update_button_text(@contact_form)
= f.submit @submit || update_button_text(@contact_form), class: 'ui primary button'
@@ -1,6 +1,6 @@
- title :index, Cmtool::ContactForm
- if @contact_forms.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::ContactForm.human_attribute_name(:gender)
+2 -2
View File
@@ -1,4 +1,4 @@
= form_for [cmtool, @directory], :html => {:multipart => true} do |f|
= form_for [cmtool, @directory], :html => {:multipart => true, :class => 'ui form'} do |f|
= render 'error_messages', :target => @directory
.field
= f.label :name
@@ -7,4 +7,4 @@
= f.label :parent_id, Cmtool::Directory.model_name.human
= f.select :parent_id, tree_options_for_select(Cmtool::Directory.full_tree, exclude: @directory.id, selected: @directory.parent_id), include_blank: ''
.actions
= f.submit @submit || update_button_text(@directory)
= f.submit @submit || update_button_text(@directory), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, Cmtool::Directory
- if @directories.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::Directory.human_attribute_name(:name)
+2 -2
View File
@@ -1,4 +1,4 @@
= form_for [cmtool, @faq] do |f|
= form_for [cmtool, @faq], html: {class: 'ui form'} do |f|
= render 'error_messages', :target => @faq
.field
@@ -8,4 +8,4 @@
= f.label :answer
= f.text_area :answer, :rows => 6, :class => 'editor_basic'
.actions
= f.submit @submit || update_button_text(@faq)
= f.submit @submit || update_button_text(@faq), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, Cmtool::Faq
- if @faqs.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::Faq.human_attribute_name(:question)
+2 -2
View File
@@ -1,4 +1,4 @@
= form_for [cmtool, @image], html: {multipart: true} do |f|
= form_for [cmtool, @image], html: {multipart: true, class: 'ui form'} do |f|
= render 'error_messages', target: @image
.field
@@ -9,4 +9,4 @@
= f.select :directory_id, Cmtool::Directory.all.map{|d| ["-"*d.tree_depth + ' ' + d.name.to_s, d.id]}
.actions
= f.submit @submit || update_button_text(@image)
= f.submit @submit || update_button_text(@image), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, Cmtool::Image
- if @images.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::Image.model_name.human
+2 -2
View File
@@ -1,7 +1,7 @@
= form_for [cmtool, @keyword] do |f|
= form_for [cmtool, @keyword], html: {class: 'ui form'} do |f|
= render 'error_messages', :target => @keyword
.form-row
.form-label= f.label :name
.form-field= f.text_field :name
.form-row: .form-actions
= f.submit @submit || update_button_text(@keyword), class: 'form-submit-button'
= f.submit @submit || update_button_text(@keyword), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, Cmtool::Keyword
- if @keywords.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::Keyword.human_attribute_name(:name)
+2 -2
View File
@@ -1,4 +1,4 @@
= form_for [cmtool, @news], html: {multipart: true} do |f|
= form_for [cmtool, @news], html: {multipart: true, class: 'ui form'} do |f|
= render 'error_messages', target: @news
.field
= f.label :title
@@ -19,4 +19,4 @@
.field
= render "cmtool/keywords/habtm", subject: @news
.actions
= f.submit @submit || update_button_text(@news)
= f.submit @submit || update_button_text(@news), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, Cmtool::News
- if @news.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::News.human_attribute_name(:title)
@@ -1,4 +1,4 @@
= form_for [cmtool, @newsletter_subscription] do |f|
= form_for [cmtool, @newsletter_subscription], html: {class: 'ui form'} do |f|
= render 'error_messages', :target => @newsletter_subscription
.field
@@ -8,4 +8,4 @@
= f.label :active
= f.check_box :active
.actions
= f.submit @submit || update_button_text(@newsletter_subscription)
= f.submit @submit || update_button_text(@newsletter_subscription), class: 'ui primary button'
@@ -1,6 +1,6 @@
- title :index, Cmtool::NewsletterSubscription
- if @newsletter_subscriptions.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::NewsletterSubscription.human_attribute_name(:email)
+12 -5
View File
@@ -1,9 +1,10 @@
javascript:
page_vars = #{Cmtool::YmlFile.all_as_object.to_json.html_safe};
#preview-modal.reveal-modal.large data-reveal=""
iframe allowfullscreen="" frameborder="0" height="100%" src="about:blank" width="100%"
a.close-reveal-modal ×
= form_for [cmtool, @page] do |f|
#preview-modal.ui.large.modal
i.close.icon
.content
iframe allowfullscreen="" frameborder="0" height="100%" src="about:blank" width="100%"
= form_for [cmtool, @page], html: {class: 'ui form'} do |f|
= render 'error_messages', target: @page
.form-row
.form-label= f.label :name
@@ -37,6 +38,12 @@ javascript:
.field
= f.label :footer
= f.text_area :footer, rows: 15, cols: 80, class: 'html-content'
= collapsible_content 'Page Settings (JSON)' do
.field
= f.label :page_settings
p.help-text JSON configuration for this page. Use Ace editor in JSON mode.
= f.text_area :page_settings, rows: 12, cols: 80, class: 'html-content', data: { mode: 'json' },
value: (f.object.page_settings.presence || {}).to_json
.form-row
.form-label= f.label :parent_id
.form-field= f.select :parent_id, tree_options_for_select(Page.full_tree(@page.locale || Page.locales.first), exclude: @page.id, selected: @page.parent_id), include_blank: ' -- '
@@ -52,5 +59,5 @@ javascript:
.field
= render "cmtool/keywords/habtm", subject: @page
.form-row: .form-actions
= f.submit @submit || update_button_text(f.object), class: 'button'
= f.submit @submit || update_button_text(f.object), class: 'ui primary button'
-#= button_tag 'Preview (unsupported)', onclick: %{$('form').attr('action', '/' + $('#page_name').val()).submit();}
+1 -1
View File
@@ -1,5 +1,5 @@
- title :index, Page
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Page.human_attribute_name(:name)
+2 -2
View File
@@ -1,4 +1,4 @@
= form_for [cmtool, @quote], html: {multipart: true} do |f|
= form_for [cmtool, @quote], html: {multipart: true, class: 'ui form'} do |f|
= render 'error_messages', target: @quote
.field
= f.label :owner
@@ -19,4 +19,4 @@
= f.label :active
= f.check_box :active
.actions
= f.submit @submit || update_button_text(@quote)
= f.submit @submit || update_button_text(@quote), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, Cmtool::Quote
- if @quotes.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::Quote.human_attribute_name(:owner)
+2 -2
View File
@@ -1,4 +1,4 @@
= form_for [cmtool, @user] do |f|
= form_for [cmtool, @user], html: {class: 'ui form'} do |f|
= render 'error_messages', :target => @user
.field
@@ -24,4 +24,4 @@
= f.label :admin
= f.check_box :admin
.actions
= f.submit @submit || update_button_text(@user)
= f.submit @submit || update_button_text(@user), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, User
- if @users.any?
table.index-table
table.ui.celled.table
thead
tr
th= User.human_attribute_name(:email)
+2 -2
View File
@@ -1,4 +1,4 @@
= form_for [cmtool, @yml_file] do |f|
= form_for [cmtool, @yml_file], html: {class: 'ui form'} do |f|
= render 'error_messages', :target => @yml_file
.form-row
.form-label= f.label :name
@@ -6,4 +6,4 @@
.form-row
= f.text_area :body, class: 'yml-content'
.form-row: .form-actions
= f.submit @submit || update_button_text(@yml_file), class: 'form-submit-button'
= f.submit @submit || update_button_text(@yml_file), class: 'ui primary button'
+1 -1
View File
@@ -1,6 +1,6 @@
- title :index, Cmtool::YmlFile
- if @yml_files.any?
table.index-table.table.table-striped.table-hover
table.ui.celled.table
thead
tr
th= Cmtool::YmlFile.human_attribute_name(:name)
+20 -19
View File
@@ -24,23 +24,24 @@ html lang="en"
body
= render 'cmtool/application/menu'
= render 'cmtool/application/alerts'
.row
.small-12.large-9.columns
h3= content_for?(:page_title) ? yield(:page_title) : application_title
= content_for?(:content) ? yield(:content) : yield
- if content_for?(:page_links)
#sub-navigation-container= yield(:page_links)
.show-for-large-up.large-3.columns
.panel
h4 Links
ul.side-nav
li= link_to "Home", cmtool.root_path
li= link_to 'Wiki', 'https://github.com/bterkuile/cmtool/wiki', target: :_blank
= yield :sidebar
footer
p
span &copy; Cmtool
span= Date.today.year
= yield :footer
.ui.container
= render 'cmtool/application/alerts'
.ui.grid
.twelve.wide.column
h3.ui.header= content_for?(:page_title) ? yield(:page_title) : application_title
= content_for?(:content) ? yield(:content) : yield
- if content_for?(:page_links)
#sub-navigation-container= yield(:page_links)
.four.wide.column
.ui.segment
h4.ui.header Links
.ui.link.list
a.item href=cmtool.root_path Home
a.item href="https://github.com/bterkuile/cmtool/wiki" target="_blank" Wiki
= yield :sidebar
footer.ui.footer
p
span &copy; Cmtool
span= Date.today.year
= yield :footer
#hidden-html.hide= yield :hidden_html
+1 -2
View File
@@ -23,8 +23,7 @@ Gem::Specification.new do |s|
s.add_runtime_dependency "slim-rails", ">= 0"
# s.add_runtime_dependency "tinymce-rails", ">= 0"
s.add_runtime_dependency "jquery-rails", ">= 0"
s.add_runtime_dependency "paperclip", ">= 0"
s.add_runtime_dependency "foundation-rails", ">= 0"
s.add_runtime_dependency "fomantic-ui-sass", ">= 0"
s.add_runtime_dependency "ace-rails-ap", ">= 0"
s.add_runtime_dependency "font-awesome-rails", ">= 0"
s.add_runtime_dependency "pickadate-rails", ">= 0"
+7
View File
@@ -5,6 +5,13 @@ require 'cmtool/includes/user'
require 'cmtool/includes/page'
require 'cmtool/includes/pages_controller'
require 'cmtool/menu'
require 'email_validator'
# Paperclip replacement — stores file metadata as CouchDB properties,
# handles thumbnail generation via MiniMagick.
# Replace `include Paperclip::Glue` + `has_attached_file` with
# `include SimplyCouch::HasAttachment` + `has_attachment`
# has_attachment now in simply_couch gem
module Cmtool
end
+24 -25
View File
@@ -1,9 +1,8 @@
=begin
require 'couch_potato'
require 'simply_stored'
require 'simply_couch'
require 'email_validator'
require 'devise'
require 'devise_simply_stored'
require 'devise_simply_couch'
require 'sass-rails'
require 'paperclip'
require 'jquery-rails'
@@ -13,28 +12,28 @@ require 'bourbon'
module Cmtool
class Engine < ::Rails::Engine
isolate_namespace Cmtool
initializer 'cmtool.build_menu', after: 'load_config_initializers' do |app|
require 'email_validator'
#require 'bourbon'
require 'slim-rails'
require 'paperclip'
require 'devise'
require 'devise_simply_stored'
require 'jquery-rails'
# require 'tinymce-rails'
require 'page' # app/models/page.rb
require 'user' # app/models/user.rb
require 'cmtool/yml_file'
require 'cmtool/keyword'
require 'cmtool/news'
require 'cmtool/faq'
require 'cmtool/quote'
require 'cmtool/contact_form'
require 'cmtool/newsletter_subscription'
require 'cmtool/image'
require 'cmtool/directory'
end
# initializer 'cmtool.build_menu', after: 'load_config_initializers' do |app|
# require 'email_validator'
# #require 'bourbon'
# require 'slim-rails'
# require 'paperclip'
# require 'devise'
# require 'devise_simply_couch'
# require 'jquery-rails'
# # require 'tinymce-rails'
#
# require 'page' # app/models/page.rb
# require 'user' # app/models/user.rb
# require 'cmtool/yml_file'
# require 'cmtool/keyword'
# require 'cmtool/news'
# require 'cmtool/faq'
# require 'cmtool/quote'
# require 'cmtool/contact_form'
# require 'cmtool/newsletter_subscription'
# require 'cmtool/image'
# require 'cmtool/directory'
# end
config.after_initialize do
Cmtool::Menu.register do
+9 -2
View File
@@ -2,7 +2,7 @@ module Cmtool
module Includes
module Page
def self.included(klass)
klass.send :include, SimplyStored::Couch
klass.send :include, SimplyCouch::Model
klass.send :include, InstanceMethods
klass.send :extend, ClassMethods
@@ -21,6 +21,13 @@ module Cmtool
klass.property :active, type: :boolean, default: true
klass.property :layout
klass.property :in_menu, type: :boolean, default: true
klass.property :page_settings, type: Hash, default: {}
# JSON string parsing (safety net until couch_potato type: Hash handles this)
klass.send(:define_method, :page_settings=) do |val|
val = JSON.parse(val) if val.is_a?(String)
super(val)
end
klass.has_ancestry by_property: :locale
@@ -66,7 +73,7 @@ module Cmtool
end
def locales
Rails.configuration.i18n.available_locales.presence || []
Rails.configuration.i18n.available_locales.presence || [:en]
end
def default_locale
+1 -1
View File
@@ -13,7 +13,7 @@ module Cmtool
# General catcher for pages
def show
@page = ::Page.find_by_name_and_locale(params[:name], I18n.locale.to_s)
not_found and return unless @page
return not_found unless @page
@sub_pages = [@page] + @page.children.select{|child| child.in_menu.present? }
template = "pages/#{@page.name}"
+2 -2
View File
@@ -2,8 +2,8 @@ module Cmtool
module Includes
module User
def self.included(klass)
klass.send :include, SimplyStored::Couch
#klass.send :include, Devise::Orm::SimplyStored
klass.send :include, SimplyCouch::Model
#klass.send :include, Devise::Orm::SimplyCouch
klass.send :include, InstanceMethods
klass.send :extend, ClassMethods
+1 -1
View File
@@ -1,3 +1,3 @@
module Cmtool
VERSION = "3.0.0"
VERSION = "4.0.0"
end
+2 -2
View File
@@ -19,8 +19,8 @@ Devise.setup do |config|
# Load and configure the ORM. Supports :active_record (default) and
# :mongoid (bson_ext recommended) by default. Other ORMs may be
# available as additional gems.
#require 'devise/orm/simply_stored'
require 'orm_adapter/adapters/simply_stored'
#require 'devise/orm/simply_couch'
require 'orm_adapter/adapters/simply_couch'
# ==> Configuration for any authentication mechanism
# Configure which keys are used when authenticating a user. The default is