4 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
51 changed files with 224 additions and 1649 deletions
+2 -3
View File
@@ -21,12 +21,11 @@ group :assets do
gem 'momentjs-rails'
end
gem 'simply_stored' , github: 'bterkuile/simply_stored', branch: 'master'
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', branch: 'master'
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
+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,6 +1,6 @@
#= require jquery
#= require jquery_ujs
#= require foundation
#= require semantic-ui
#= require ace/ace
#= require moment
#= require ace/theme-monokai
@@ -19,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()
@@ -38,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 ->
@@ -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
+29 -5
View File
@@ -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 -15
View File
@@ -1,20 +1,11 @@
module Cmtool
class Image
include SimplyStored::Couch
include Paperclip::Glue
# TODO: Replace Paperclip with SimplyStored::HasAttachment
# 1. Change `include Paperclip::Glue` to `include SimplyStored::HasAttachment`
# 2. Replace `has_attached_file :file, styles: {...}` with `has_attachment :file, styles: {...}`
# 3. Replace `validates_attachment` with standard Rails validations
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 -12
View File
@@ -1,22 +1,14 @@
module Cmtool
class News
include SimplyStored::Couch
include Paperclip::Glue
# TODO: Replace Paperclip with SimplyStored::HasAttachment
# 1. Change `include Paperclip::Glue` to `include SimplyStored::HasAttachment`
# 2. Replace `has_attached_file :image, styles: {...}` with `has_attachment :image, styles: {...}`
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 -12
View File
@@ -1,11 +1,6 @@
module Cmtool
class Quote
include SimplyStored::Couch
include Paperclip::Glue
# TODO: Replace Paperclip with SimplyStored::HasAttachment
# 1. Change `include Paperclip::Glue` to `include SimplyStored::HasAttachment`
# 2. Replace `has_attached_file :image, styles: {...}` with `has_attachment :image, styles: {...}`
include SimplyCouch::Model
property :owner
property :function
property :state
@@ -13,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)
+6 -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
@@ -58,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"
+2 -2
View File
@@ -10,8 +10,8 @@ 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 SimplyStored::HasAttachment` + `has_attachment`
# has_attachment now in simply_stored gem
# `include SimplyCouch::HasAttachment` + `has_attachment`
# has_attachment now in simply_couch gem
module Cmtool
end
+3 -4
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'
@@ -19,7 +18,7 @@ module Cmtool
# require 'slim-rails'
# require 'paperclip'
# require 'devise'
# require 'devise_simply_stored'
# require 'devise_simply_couch'
# require 'jquery-rails'
# # require 'tinymce-rails'
#
+1 -1
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
+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