fae-rails 2.1.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -2
- data/app/assets/config/fae/manifest.js +2 -0
- data/app/assets/javascripts/fae/_contrast.js +50 -0
- data/app/assets/javascripts/fae/_deploy.js +198 -0
- data/app/assets/javascripts/fae/_modals.js +94 -0
- data/app/assets/javascripts/fae/application.js +7 -1
- data/app/assets/javascripts/fae/form/_ajax.js +17 -5
- data/app/assets/javascripts/fae/form/_filtering.js +34 -0
- data/app/assets/javascripts/fae/form/_form.js +5 -2
- data/app/assets/javascripts/fae/form/_form_manager.js +295 -0
- data/app/assets/javascripts/fae/form/_slugger.js.erb +2 -2
- data/app/assets/javascripts/fae/form/_validator.js +224 -55
- data/app/assets/javascripts/fae/form/drag_drop.js +109 -0
- data/app/assets/javascripts/fae/form/inputs/_select.js +10 -4
- data/app/assets/javascripts/fae/form/inputs/_text.js +23 -9
- data/app/assets/javascripts/fae/vendor/simplemde/codemirror-4.inline-attachment.js +95 -0
- data/app/assets/javascripts/fae/vendor/simplemde/inline-attachment.js +405 -0
- data/app/assets/stylesheets/fae/application.css +1 -0
- data/app/assets/stylesheets/fae/base.scss +7 -3
- data/app/assets/stylesheets/fae/globals/_tags.scss +1 -1
- data/app/assets/stylesheets/fae/globals/imports/_variables.scss +1 -0
- data/app/assets/stylesheets/fae/globals/layout/_base.scss +9 -4
- data/app/assets/stylesheets/fae/globals/layout/_content-header.scss +14 -4
- data/app/assets/stylesheets/fae/globals/legacy/_pre-1.3.scss +1 -1
- data/app/assets/stylesheets/fae/globals/navigation/_footer.scss +1 -1
- data/app/assets/stylesheets/fae/globals/navigation/_header.scss +3 -3
- data/app/assets/stylesheets/fae/globals/navigation/_multi-col-subnav.scss +50 -0
- data/app/assets/stylesheets/fae/globals/navigation/_sidenav.scss +2 -2
- data/app/assets/stylesheets/fae/globals/navigation/_utility.scss +1 -1
- data/app/assets/stylesheets/fae/modules/_buttons.scss +11 -0
- data/app/assets/stylesheets/fae/modules/_deploy.scss +25 -0
- data/app/assets/stylesheets/fae/modules/_errors-bar.scss +19 -0
- data/app/assets/stylesheets/fae/modules/_modal.scss +25 -0
- data/app/assets/stylesheets/fae/modules/_toggles.scss +39 -23
- data/app/assets/stylesheets/fae/modules/forms/_asset-actions.scss +1 -1
- data/app/assets/stylesheets/fae/modules/forms/_base.scss +14 -1
- data/app/assets/stylesheets/fae/modules/forms/_checkbox.scss +1 -1
- data/app/assets/stylesheets/fae/modules/forms/_date.scss +20 -4
- data/app/assets/stylesheets/fae/modules/forms/_form-manager.scss +82 -0
- data/app/assets/stylesheets/fae/modules/forms/_hints.scss +1 -1
- data/app/assets/stylesheets/fae/modules/forms/_label.scss +1 -1
- data/app/assets/stylesheets/fae/modules/forms/_radio.scss +1 -1
- data/app/assets/stylesheets/fae/modules/forms/_select.scss +9 -8
- data/app/assets/stylesheets/fae/modules/forms/_simple-mde.scss +72 -1
- data/app/assets/stylesheets/fae/modules/forms/_textarea.scss +1 -1
- data/app/assets/stylesheets/fae/modules/tables/_base.scss +1 -1
- data/app/assets/stylesheets/fae/modules/tables/_filters.scss +4 -0
- data/app/assets/stylesheets/fae/modules/tables/_pagination.scss +2 -2
- data/app/assets/stylesheets/fae/pages/_error.scss +1 -1
- data/app/assets/stylesheets/fae/pages/_login.scss +5 -1
- data/app/assets/stylesheets/fae/simplemde_override.scss +32 -0
- data/app/controllers/fae/application_controller.rb +9 -2
- data/app/controllers/fae/base_controller.rb +6 -2
- data/app/controllers/fae/deploy_controller.rb +24 -0
- data/app/controllers/fae/deploy_hooks_controller.rb +71 -0
- data/app/controllers/fae/form_managers_controller.rb +19 -0
- data/app/controllers/fae/options_controller.rb +1 -0
- data/app/controllers/fae/setup_controller.rb +2 -2
- data/app/controllers/fae/static_pages_controller.rb +6 -1
- data/app/controllers/fae/users_controller.rb +11 -1
- data/app/controllers/fae/utilities_controller.rb +18 -6
- data/app/helpers/fae/application_helper.rb +36 -2
- data/app/helpers/fae/form_helper.rb +26 -2
- data/app/helpers/fae/view_helper.rb +26 -9
- data/app/models/concerns/fae/base_model_concern.rb +17 -0
- data/app/models/concerns/fae/seo_set_concern.rb +1 -0
- data/app/models/fae/change.rb +20 -6
- data/app/models/fae/deploy_hook.rb +12 -0
- data/app/models/fae/form_manager.rb +24 -0
- data/app/models/fae/option.rb +1 -0
- data/app/models/fae/seo_set.rb +14 -0
- data/app/models/fae/user.rb +2 -2
- data/app/services/fae/netlify_api.rb +213 -0
- data/app/uploaders/fae/file_uploader.rb +1 -1
- data/app/uploaders/fae/image_uploader.rb +2 -2
- data/app/views/devise/unlocks/new.html.slim +5 -9
- data/app/views/fae/application/_content_form.html.slim +16 -11
- data/app/views/fae/application/_file_uploader.html.slim +7 -2
- data/app/views/fae/application/_global_search_results.html.slim +1 -1
- data/app/views/fae/application/_header.slim +4 -1
- data/app/views/fae/application/_mobilenav.slim +3 -0
- data/app/views/fae/application/_seo_set_form.html.slim +12 -0
- data/app/views/fae/deploy/index.html.slim +40 -0
- data/app/views/fae/deploy_hooks/_form.html.slim +18 -0
- data/app/views/fae/deploy_hooks/_table.html.slim +28 -0
- data/app/views/fae/deploy_hooks/edit.html.slim +3 -0
- data/app/views/fae/deploy_hooks/new.html.slim +3 -0
- data/app/views/fae/images/_image_uploader.html.slim +12 -3
- data/app/views/fae/options/_form.html.slim +6 -2
- data/app/views/fae/pages/activity_log.html.slim +7 -3
- data/app/views/fae/pages/home.html.slim +3 -4
- data/app/views/fae/shared/_errors.slim +0 -3
- data/app/views/fae/shared/_form_header.html.slim +20 -12
- data/app/views/fae/shared/_nested_table.html.slim +5 -2
- data/app/views/fae/shared/_recent_changes.html.slim +1 -1
- data/app/views/fae/shared/_shared_nested_table.html.slim +9 -3
- data/app/views/layouts/fae/application.html.slim +2 -1
- data/config/deploy.rb +3 -1
- data/config/initializers/carrierwave.rb +41 -2
- data/config/initializers/devise.rb +6 -6
- data/config/initializers/fae_judge.rb +4 -2
- data/config/locales/fae.en.yml +49 -4
- data/config/locales/fae.zh-CN.yml +2 -2
- data/config/puma.rb +82 -0
- data/config/routes.rb +9 -1
- data/db/migrate/20140809222030_add_user_table.rb +1 -1
- data/db/migrate/20190925153222_create_fae_form_managers.rb +11 -0
- data/db/migrate/20220118192729_create_fae_publish_hooks.rb +10 -0
- data/db/migrate/20220128133730_rename_publish_hooks.rb +5 -0
- data/db/migrate/20220202153607_add_position_to_deploy_hooks.rb +6 -0
- data/db/migrate/20221118161833_create_fae_seo_sets.rb +13 -0
- data/lib/fae/concerns/models/base.rb +2 -0
- data/lib/fae/engine.rb +3 -3
- data/lib/fae/options.rb +18 -18
- data/lib/fae/version.rb +1 -1
- data/lib/generators/fae/base_generator.rb +28 -5
- data/lib/generators/fae/controller_generator.rb +0 -1
- data/lib/generators/fae/install_generator.rb +1 -1
- data/lib/generators/fae/model_generator.rb +1 -2
- data/lib/generators/fae/nested_index_scaffold_generator.rb +1 -2
- data/lib/generators/fae/nested_scaffold_generator.rb +23 -2
- data/lib/generators/fae/page_generator.rb +1 -2
- data/lib/generators/fae/scaffold_generator.rb +1 -1
- data/lib/generators/fae/templates/assets/fae.js +1 -1
- data/lib/generators/fae/templates/controllers/nested_scaffold_controller.rb +13 -1
- data/lib/generators/fae/templates/controllers/scaffold_controller.rb +7 -0
- data/lib/generators/fae/templates/initializers/fae.rb +16 -1
- data/lib/generators/fae/templates/views/_form.html.slim +12 -1
- data/lib/generators/fae/templates/views/_form_index_nested.html.slim +15 -1
- data/lib/generators/fae/templates/views/_form_nested.html.slim +22 -2
- data/lib/generators/fae/templates/views/static_page_form.html.slim +13 -1
- metadata +53 -24
- data/config/deploy/dev.rb +0 -19
- data/config/deploy/prod.rb +0 -19
- data/config/deploy/stage.rb +0 -19
- /data/app/assets/javascripts/fae/vendor/{simplemde.min.js → simplemde/simplemde.min.js} +0 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
ruby:
|
2
|
+
form_options = {
|
3
|
+
html: {
|
4
|
+
multipart: true,
|
5
|
+
novalidate: true,
|
6
|
+
class: 'js-file-form',
|
7
|
+
remote: true,
|
8
|
+
data: {
|
9
|
+
type: "html"
|
10
|
+
}
|
11
|
+
}
|
12
|
+
}
|
13
|
+
= simple_form_for(@deploy_hook, form_options) do |f|
|
14
|
+
= fae_input f, :environment
|
15
|
+
= fae_input f, :url, label: 'URL'
|
16
|
+
|
17
|
+
= f.submit
|
18
|
+
= button_tag 'Cancel', type: 'button', class: 'js-cancel-nested cancel-nested-button'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
section.addedit-form.js-addedit-form
|
2
|
+
a.js-add-link.table-add-link.button.-small href=fae.new_deploy_hook_path = t('fae.deploy_hook.add_deploy_hook')
|
3
|
+
h2 = t('fae.deploy_hook.section_heading')
|
4
|
+
- if t('fae.deploy_hook.section_helper_text').present?
|
5
|
+
h6.table-helper-text = t('fae.deploy_hook.section_helper_text')
|
6
|
+
== render 'fae/application/flash_messages'
|
7
|
+
table.js-sort-row
|
8
|
+
thead
|
9
|
+
tr
|
10
|
+
th.th-sortable-handle
|
11
|
+
th = t('fae.deploy_hooks.environment')
|
12
|
+
th = t('fae.deploy_hooks.url')
|
13
|
+
th.-action
|
14
|
+
tbody
|
15
|
+
- if @deploy_hooks.present?
|
16
|
+
- @deploy_hooks.each do |item|
|
17
|
+
tr id=tr_id(item)
|
18
|
+
td.sortable-handle: i.icon-sort
|
19
|
+
td: a.js-edit-link href=edit_deploy_hook_path(item) #{item.environment}
|
20
|
+
td = item.url
|
21
|
+
td = fae_delete_button item, item, class: 'js-tooltip table-action js-delete-link', remote: true
|
22
|
+
|
23
|
+
- else
|
24
|
+
tr
|
25
|
+
- td_link = link_to 'add some', fae.new_deploy_hook_path, class: 'js-add-link'
|
26
|
+
td colspan="4" No #{t('fae.deploy_hook.section_heading')} yet, #{td_link}.
|
27
|
+
|
28
|
+
.js-addedit-form-wrapper
|
@@ -15,15 +15,19 @@ ruby:
|
|
15
15
|
attached_as ||= image_name.to_s
|
16
16
|
languages = f.object.class.try(:fae_fields).try(:[], image_name).try(:[], :languages)
|
17
17
|
language ||= nil
|
18
|
+
show_form_manager ||= true
|
18
19
|
|
19
20
|
- if languages.present?
|
20
21
|
- languages.each do |lang|
|
21
|
-
= render 'fae/images/image_uploader', f: f, item: item, image_name: "#{image_name}_#{lang}".to_sym, label: "#{label} (#{lang.to_s})", alt_label: "#{alt_label} (#{lang.to_s})", caption_label: "#{caption_label} (#{lang.to_s})", helper_text: helper_text, alt_helper_text: alt_helper_text, caption_helper_text: caption_helper_text, show_caption: show_caption, required: required, attached_as: attached_as, language: lang
|
22
|
+
= render 'fae/images/image_uploader', f: f, item: item, image_name: "#{image_name}_#{lang}".to_sym, label: "#{label} (#{lang.to_s})", alt_label: "#{alt_label} (#{lang.to_s})", caption_label: "#{caption_label} (#{lang.to_s})", helper_text: helper_text, alt_helper_text: alt_helper_text, caption_helper_text: caption_helper_text, show_caption: show_caption, required: required, attached_as: attached_as, language: lang, show_form_manager: show_form_manager
|
22
23
|
|
23
24
|
- else
|
25
|
+
ruby:
|
26
|
+
form_manager_id = show_form_manager ? "#{item.class.name}_#{attached_as}" : nil
|
27
|
+
form_manager_id += "_#{language}" if language.present?
|
24
28
|
- wrapper_html = language.present? ? { data: { language: language } } : {}
|
25
29
|
= f.simple_fields_for image_name, defaults: { wrapper_html: wrapper_html } do |i|
|
26
|
-
.field.
|
30
|
+
.input.field.image*wrapper_html class="#{image_name}" data-form-manager-id=form_manager_id
|
27
31
|
label class="#{'required' if required}"
|
28
32
|
- if required
|
29
33
|
abbr title="required" *
|
@@ -31,7 +35,8 @@ ruby:
|
|
31
35
|
= " #{label.html_safe}"
|
32
36
|
|
33
37
|
- if helper_text.present?
|
34
|
-
h6.helper_text
|
38
|
+
h6.helper_text
|
39
|
+
span.helper_text_text = helper_text
|
35
40
|
|
36
41
|
- if the_image.asset.present?
|
37
42
|
.asset-actions
|
@@ -52,6 +57,8 @@ ruby:
|
|
52
57
|
options = { label: caption_label.html_safe }
|
53
58
|
options[:helper_text] = caption_helper_text if caption_helper_text.present?
|
54
59
|
options[:wrapper_html] = wrapper_html
|
60
|
+
options[:wrapper_html].merge!({class: "#{form_manager_id}_caption_container"})
|
61
|
+
options[:show_form_manager] = false
|
55
62
|
|
56
63
|
= fae_input i, :caption, options
|
57
64
|
|
@@ -60,6 +67,8 @@ ruby:
|
|
60
67
|
options = { label: alt_label.html_safe }
|
61
68
|
options[:helper_text] = alt_helper_text if alt_helper_text.present?
|
62
69
|
options[:wrapper_html] = wrapper_html
|
70
|
+
options[:wrapper_html].merge!({class: "#{form_manager_id}_alt_container"})
|
71
|
+
options[:show_form_manager] = false
|
63
72
|
|
64
73
|
= fae_input i, :alt, options
|
65
74
|
|
@@ -3,14 +3,18 @@
|
|
3
3
|
h1 Root Settings
|
4
4
|
.content-header-buttons
|
5
5
|
a.button#js-header-cancel href=fae.root_path(cancelled: true) = t('fae.form.cancel')
|
6
|
-
=
|
6
|
+
input name="commit" type="submit" value=t('fae.form.save')
|
7
7
|
|
8
8
|
== render 'flash_messages'
|
9
9
|
|
10
|
-
|
10
|
+
main.content
|
11
11
|
= fae_input f, :title, label: t('fae.options.project.name')
|
12
12
|
= fae_input f, :time_zone, wrapper_class: 'select'
|
13
|
+
= fae_input f, :colorway, label: t('fae.options.colorway'), helper_text: t('fae.options.colorway_helper')
|
13
14
|
= fae_input f, :live_url, label: t('fae.options.live_url'), helper_text: t('fae.options.url_helper')
|
14
15
|
= fae_input f, :stage_url, label: t('fae.options.stage_url'), helper_text: t('fae.options.url_helper')
|
15
16
|
= fae_image_form f, :logo, helper_text: t('fae.options.logo_helper')
|
16
17
|
= fae_image_form f, :favicon
|
18
|
+
|
19
|
+
section.content#deploy_hooks
|
20
|
+
== render "fae/deploy_hooks/table"
|
@@ -1,12 +1,16 @@
|
|
1
|
-
|
1
|
+
header.content-header.js-content-header
|
2
|
+
h1 = t('fae.application.activity_log_heading')
|
2
3
|
|
3
4
|
main.content
|
4
5
|
|
5
6
|
== fae_filter_form title: t('fae.changes.title'), action: fae.activity_log_filter_path do
|
6
|
-
== fae_filter_select :user, options: Fae::User.all.map { |u| [u.full_name, u.id] }, translation_path: 'fae.changes.models'
|
7
|
-
== fae_filter_select :model, options: Fae::Change.unique_changeable_types, translation_path: 'fae.changes.models'
|
8
7
|
== fae_filter_select :type, options: [t('fae.changes.created'), t('fae.changes.updated'), t('fae.changes.deleted')], translation_path: 'fae.changes.models'
|
8
|
+
== fae_filter_datepicker :start_date, placeholder: 'MM/DD/YYYY', class: 'test'
|
9
|
+
== fae_filter_datepicker :end_date, placeholder: 'MM/DD/YYYY'
|
9
10
|
== fae_filter_select :date, options: [t('fae.changes.last_hour'), t('fae.changes.last_day'), t('fae.changes.last_week'), t('fae.changes.last_month')], placeholder: t('fae.changes.all_time')
|
11
|
+
br
|
12
|
+
== fae_filter_select :user, options: Fae::User.all.map { |u| [u.full_name, u.id] }, translation_path: 'fae.changes.models'
|
13
|
+
== fae_filter_select :model, options: Fae::Change.unique_changeable_types, translation_path: 'fae.changes.models'
|
10
14
|
|
11
15
|
table.js-results-table
|
12
16
|
thead
|
@@ -19,8 +19,8 @@ header.content-header.js-content-header.-dashboard
|
|
19
19
|
- @list.each do |item|
|
20
20
|
- begin
|
21
21
|
- parent = item.respond_to?(:fae_parent) ? item.fae_parent : nil
|
22
|
-
- edit_path = edit_polymorphic_path([main_app, fae_scope, parent, item])
|
23
|
-
- index_path = polymorphic_path([main_app, fae_scope, parent, item.class.to_s.pluralize.underscore])
|
22
|
+
- edit_path = edit_polymorphic_path([main_app, fae_scope.to_sym, parent, item])
|
23
|
+
- index_path = polymorphic_path([main_app, fae_scope.to_sym, parent, item.class.to_s.pluralize.underscore.to_sym])
|
24
24
|
tr
|
25
25
|
td: a href=edit_path = item.fae_display_field
|
26
26
|
td: a href=index_path = item.class.to_s
|
@@ -33,5 +33,4 @@ header.content-header.js-content-header.-dashboard
|
|
33
33
|
p
|
34
34
|
= t('fae.page.no_objs_start')
|
35
35
|
br
|
36
|
-
a href="https://www.faecms.com/documentation/quickstart-guide" target="_blank"
|
37
|
-
= t('fae.page.no_objs.end')
|
36
|
+
a href="https://www.faecms.com/documentation/quickstart-guide" target="_blank" = t('fae.page.no_objs_end')
|
@@ -1,16 +1,17 @@
|
|
1
1
|
ruby:
|
2
2
|
require_locals ['header'], local_assigns
|
3
|
-
save_button_text
|
4
|
-
cancel_button_text
|
5
|
-
cloneable
|
6
|
-
clone_button_text
|
7
|
-
|
8
|
-
|
9
|
-
header_as_string
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
save_button_text ||= t('fae.form.save')
|
4
|
+
cancel_button_text ||= t('fae.form.cancel')
|
5
|
+
cloneable ||= false
|
6
|
+
clone_button_text ||= t('fae.form.clone')
|
7
|
+
launch_manager_text ||= t('fae.form.launch_form_manager')
|
8
|
+
subnav ||= []
|
9
|
+
header_as_string = header.is_a?(String) ? header : header.class.name.split('::').last
|
10
|
+
header_as_string = header_as_string.singularize
|
11
|
+
title ||= "#{params[:action]} #{header_as_string}".titleize
|
12
|
+
breadcrumb = !local_assigns[:breadcrumbs].eql?(false)
|
13
|
+
languages ||= false
|
14
|
+
show_flash_messages = !local_assigns[:show_flash_messages].eql?(false)
|
14
15
|
|
15
16
|
header.content-header.js-content-header
|
16
17
|
- if breadcrumb
|
@@ -25,9 +26,12 @@ header.content-header.js-content-header
|
|
25
26
|
.content-header-select
|
26
27
|
= select_tag 'fae-languages', options_for_select(Fae.languages.map(&:reverse), selected), id: 'js-language', class: 'small_pulldown', prompt: 'All Languages'
|
27
28
|
|
29
|
+
- if Fae.use_form_manager
|
30
|
+
a.button.js-launch-form-manager href='#' = launch_manager_text
|
31
|
+
|
28
32
|
a.button#js-header-cancel href=@index_path = cancel_button_text
|
29
33
|
- if cloneable.present? && params[:id].present?
|
30
|
-
a.button data-method="post" href="#{@index_path}?from_existing=#{params[:id]}" = clone_button_text
|
34
|
+
a.button#js-header-clone data-method="post" href="#{@index_path}?from_existing=#{params[:id]}" = clone_button_text
|
31
35
|
input name="commit" type="submit" value=save_button_text
|
32
36
|
|
33
37
|
- if subnav.present?
|
@@ -38,3 +42,7 @@ header.content-header.js-content-header
|
|
38
42
|
|
39
43
|
- if show_flash_messages
|
40
44
|
== render 'fae/shared/errors'
|
45
|
+
|
46
|
+
.errors-bar-wrapper
|
47
|
+
h2 = t('fae.save_error')
|
48
|
+
.errors-bar
|
@@ -11,6 +11,8 @@ ruby:
|
|
11
11
|
assoc_name ||= assoc.to_s # 'restaurant_bars'
|
12
12
|
title ||= assoc_name.titleize # 'Restaurant Bars'
|
13
13
|
add_button_text ||= t('fae.common.add', title: title.singularize)
|
14
|
+
hide_add_button ||= false
|
15
|
+
hide_delete_button ||= false
|
14
16
|
ordered ||= false
|
15
17
|
has_thumb ||= false
|
16
18
|
edit_column ||= false
|
@@ -33,7 +35,7 @@ ruby:
|
|
33
35
|
new_path += "item_id=#{parent_item.id}&=item_class=#{parent_item.class.to_s}"
|
34
36
|
end
|
35
37
|
|
36
|
-
options_for_table = { index: index, assoc: assoc, assoc_name: assoc_name, title: title, add_button_text: add_button_text, ordered: ordered, has_thumb: has_thumb, edit_column: edit_column, cols: cols, assoc_name_singular: assoc_name_singular, new_path: new_path, edit_path: edit_path }
|
38
|
+
options_for_table = { index: index, assoc: assoc, assoc_name: assoc_name, title: title, add_button_text: add_button_text, hide_add_button: hide_add_button, hide_delete_button: hide_delete_button, ordered: ordered, has_thumb: has_thumb, edit_column: edit_column, cols: cols, assoc_name_singular: assoc_name_singular, new_path: new_path, edit_path: edit_path }
|
37
39
|
options_for_table[:parent_item] = parent_item unless index
|
38
40
|
|
39
41
|
section.addedit-form.js-addedit-form class="#{'content' if index}"
|
@@ -41,7 +43,8 @@ section.addedit-form.js-addedit-form class="#{'content' if index}"
|
|
41
43
|
== render 'fae/shared/shared_nested_table', options_for_table
|
42
44
|
|
43
45
|
- else
|
44
|
-
|
46
|
+
- unless hide_add_button
|
47
|
+
a.js-add-link.table-add-link.button.-small href=new_path = add_button_text
|
45
48
|
h2 = title
|
46
49
|
- if helper_text.present?
|
47
50
|
h6.table-helper-text = helper_text
|
@@ -8,7 +8,7 @@
|
|
8
8
|
th = t('fae.changes.user')
|
9
9
|
th = t('fae.changes.type')
|
10
10
|
th = t('fae.changes.attrs')
|
11
|
-
th.-action-wide t('fea.changes.modified')
|
11
|
+
th.-action-wide = t('fea.changes.modified')
|
12
12
|
tbody
|
13
13
|
- if @item.try(:tracked_changes).present?
|
14
14
|
- @item.tracked_changes.each do |change|
|
@@ -2,6 +2,7 @@ ruby:
|
|
2
2
|
colspan = cols.length + 1
|
3
3
|
colspan += 1 if ordered
|
4
4
|
colspan += 1 if has_thumb
|
5
|
+
colspan -= 1 if hide_delete_button
|
5
6
|
table_class = ordered ? 'js-sort-row' : nil
|
6
7
|
|
7
8
|
options_for_td = { cols: cols, edit_path: edit_path, edit_column: edit_column }
|
@@ -17,7 +18,8 @@ table class=table_class
|
|
17
18
|
= th_columns(col)
|
18
19
|
- if edit_column
|
19
20
|
th.-action data-sorter="false"
|
20
|
-
|
21
|
+
- unless hide_delete_button
|
22
|
+
th.-action
|
21
23
|
tbody
|
22
24
|
- records = index ? @items : parent_item.send(assoc)
|
23
25
|
- if records.present?
|
@@ -35,12 +37,16 @@ table class=table_class
|
|
35
37
|
td
|
36
38
|
a.js-edit-link.js-tooltip.table-action title=t('fae.common.edit') href=self.send(edit_path, item)
|
37
39
|
i.icon-edit
|
38
|
-
|
40
|
+
- unless hide_delete_button
|
41
|
+
td = fae_delete_button item, "/#{fae_path}/#{assoc_name}/#{item.id.to_s}", class: 'js-tooltip table-action js-delete-link', remote: true
|
39
42
|
|
40
|
-
-
|
43
|
+
- elsif !hide_add_button
|
41
44
|
tr
|
42
45
|
- td_link = link_to 'add some', new_path, class: 'js-add-link'
|
43
46
|
|
44
47
|
td colspan=colspan.to_s No #{title} yet, #{td_link}.
|
48
|
+
- else
|
49
|
+
tr
|
50
|
+
td colspan=colspan.to_s No #{title} yet.
|
45
51
|
|
46
52
|
.js-addedit-form-wrapper
|
@@ -9,9 +9,10 @@ html
|
|
9
9
|
== javascript_include_tag 'fae/application'
|
10
10
|
== csrf_meta_tags
|
11
11
|
|
12
|
-
body class=body_class
|
12
|
+
body class=body_class style=('--highlight-color:' + '#' + @option.colorway if @option.colorway.present?)
|
13
13
|
== render 'mobilenav'
|
14
14
|
== render 'header'
|
15
|
+
.js-form-manager-container
|
15
16
|
section.main-content#js-main-content
|
16
17
|
== render 'sidenav'
|
17
18
|
|
data/config/deploy.rb
CHANGED
@@ -38,7 +38,8 @@ namespace :deploy do
|
|
38
38
|
desc 'Symlink secrets.yml'
|
39
39
|
task :symlink_secrets do
|
40
40
|
on roles(:app) do
|
41
|
-
execute "
|
41
|
+
execute "rm #{release_path}/spec/dummy/config/secrets.yml"
|
42
|
+
execute "ln -s #{shared_path}/secrets.yml #{release_path}/spec/dummy/config/secrets.yml"
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
@@ -68,6 +69,7 @@ namespace :deploy do
|
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
72
|
+
after 'deploy:updating', 'deploy:symlink_secrets'
|
71
73
|
after :finishing, 'deploy:cleanup'
|
72
74
|
|
73
75
|
end
|
@@ -1,3 +1,42 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
CarrierWave.configure do |config|
|
2
|
+
config.cache_dir = "#{Rails.root}/tmp/fae/uploads"
|
3
|
+
|
4
|
+
if Rails.env.production? || Rails.env.remote_development?
|
5
|
+
config.fog_provider = 'fog/aws'
|
6
|
+
config.fog_credentials = {
|
7
|
+
provider: 'AWS',
|
8
|
+
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
9
|
+
aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
|
10
|
+
region: 'us-west-2'
|
11
|
+
}
|
12
|
+
config.storage = :fog
|
13
|
+
else
|
14
|
+
config.storage = :file
|
15
|
+
end
|
16
|
+
|
17
|
+
if Rails.env.production?
|
18
|
+
config.asset_host = 'https://s3.us-west-2.amazonaws.com/fae-engine-test-fly'
|
19
|
+
config.fog_directory = 'fae-engine-test-fly'
|
20
|
+
elsif Rails.env.remote_development?
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# uncomment to deliver production assets to the local CMS
|
25
|
+
# if Rails.env.development?
|
26
|
+
# config.asset_host = ''
|
27
|
+
# config.fog_directory = ''
|
28
|
+
# end
|
29
|
+
|
30
|
+
# uncomment to upload to bucket/cdn in local dev
|
31
|
+
# if Rails.env.development?
|
32
|
+
# config.fog_provider = 'fog/aws'
|
33
|
+
# config.fog_credentials = {
|
34
|
+
# provider: 'AWS',
|
35
|
+
# aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
36
|
+
# aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
|
37
|
+
# region: 'us-west-2'
|
38
|
+
# }
|
39
|
+
# config.storage = :fog
|
40
|
+
# end
|
41
|
+
|
3
42
|
end
|
@@ -156,27 +156,27 @@ Devise.setup do |config|
|
|
156
156
|
# Defines which strategy will be used to lock an account.
|
157
157
|
# :failed_attempts = Locks an account after a number of failed attempts to sign in.
|
158
158
|
# :none = No lock strategy. You should handle locking by yourself.
|
159
|
-
|
159
|
+
config.lock_strategy = :failed_attempts
|
160
160
|
|
161
161
|
# Defines which key will be used when locking and unlocking an account
|
162
|
-
|
162
|
+
config.unlock_keys = [ :email ]
|
163
163
|
|
164
164
|
# Defines which strategy will be used to unlock an account.
|
165
165
|
# :email = Sends an unlock link to the user email
|
166
166
|
# :time = Re-enables login after a certain amount of time (see :unlock_in below)
|
167
167
|
# :both = Enables both strategies
|
168
168
|
# :none = No unlock strategy. You should handle unlocking by yourself.
|
169
|
-
|
169
|
+
config.unlock_strategy = :both
|
170
170
|
|
171
171
|
# Number of authentication tries before locking an account if lock_strategy
|
172
172
|
# is failed attempts.
|
173
|
-
|
173
|
+
config.maximum_attempts = 5
|
174
174
|
|
175
175
|
# Time interval to unlock the account if :time is enabled as unlock_strategy.
|
176
|
-
|
176
|
+
config.unlock_in = 1.hour
|
177
177
|
|
178
178
|
# Warn on the last attempt before the account is locked.
|
179
|
-
|
179
|
+
config.last_attempt_warning = true
|
180
180
|
|
181
181
|
# ==> Configuration for :recoverable
|
182
182
|
#
|
data/config/locales/fae.en.yml
CHANGED
@@ -12,6 +12,9 @@ en:
|
|
12
12
|
save: 'Save'
|
13
13
|
cancel: 'Cancel'
|
14
14
|
clone: 'Clone'
|
15
|
+
launch_form_manager: 'Manage Form'
|
16
|
+
save_form_manager: 'Save Changes'
|
17
|
+
cancel_form_manager: 'Cancel'
|
15
18
|
attribute:
|
16
19
|
first_name: 'First Name'
|
17
20
|
last_name: 'Last Name'
|
@@ -31,6 +34,13 @@ en:
|
|
31
34
|
last_login: 'Last Logged In'
|
32
35
|
active: 'Active'
|
33
36
|
add_user: 'Add User'
|
37
|
+
deploy_hook:
|
38
|
+
environment: 'Environment'
|
39
|
+
add_deploy_hook: 'Add Deploy Hook'
|
40
|
+
new_deploy_hook: 'New Deploy Hook'
|
41
|
+
edit_deploy_hook: 'Edit Deploy Hook'
|
42
|
+
section_heading: 'Deploy Hooks'
|
43
|
+
section_helper_text: ''
|
34
44
|
page:
|
35
45
|
title: 'Pages'
|
36
46
|
disabled_title: 'Disabled Admin'
|
@@ -41,7 +51,7 @@ en:
|
|
41
51
|
error_end: 'to be taken to our home page.'
|
42
52
|
hello: 'Hello'
|
43
53
|
welcome: 'Welcome to Fae'
|
44
|
-
no_objs_start: "You don'
|
54
|
+
no_objs_start: "You don't have any objects setup to manage. If you need help getting started, check out the"
|
45
55
|
no_objs_end: 'Quickstart Guide and Documentation site.'
|
46
56
|
navbar:
|
47
57
|
logout: 'Log Out'
|
@@ -52,6 +62,8 @@ en:
|
|
52
62
|
jump_to: 'Jump to...'
|
53
63
|
root_settings: 'Root Settings'
|
54
64
|
no_results: 'No Results'
|
65
|
+
deployments: 'Deploy'
|
66
|
+
deploy_hooks: 'Deploy Hooks'
|
55
67
|
changes:
|
56
68
|
recent: 'Recent Changes'
|
57
69
|
user: 'User'
|
@@ -69,6 +81,8 @@ en:
|
|
69
81
|
last_day: 'Last Day'
|
70
82
|
last_week: 'Last Week'
|
71
83
|
last_month: 'Last Month'
|
84
|
+
on_prod: 'On Prod'
|
85
|
+
on_stage: 'On Stage'
|
72
86
|
models:
|
73
87
|
users: 'Users'
|
74
88
|
types: 'Types'
|
@@ -76,18 +90,42 @@ en:
|
|
76
90
|
user: 'User'
|
77
91
|
type: 'Type'
|
78
92
|
model: 'Model'
|
93
|
+
deploy:
|
94
|
+
page:
|
95
|
+
heading: 'Deploy'
|
96
|
+
ctas:
|
97
|
+
deploy: 'Deploy'
|
98
|
+
table:
|
99
|
+
past_heading: 'Past Deploys'
|
100
|
+
deploying_heading: 'Deploying'
|
101
|
+
deploying_helper: "After making changes in the CMS, click a deploy button above to push these changes to the respective front-end environment. Once your deployment posts to the “Past Deploys” table below, updates will be ready to review in the front-end environment.<br><br>Please note that each environment is distinct and will need to be deployed separately."
|
102
|
+
title: 'Activity'
|
103
|
+
deployed: 'Date/Time'
|
104
|
+
duration: 'Duration'
|
105
|
+
branch: 'Branch'
|
106
|
+
committer: 'Committer'
|
107
|
+
context: 'Environment'
|
108
|
+
state: 'State'
|
109
|
+
error_msg: 'Error Msg'
|
110
|
+
no_deploys: 'No deploys were found.'
|
111
|
+
changes:
|
112
|
+
production_heading: 'Changes since last production deploy'
|
113
|
+
staging_heading: 'Changes since last staging deploy'
|
79
114
|
setup:
|
80
115
|
prompt: 'Please create your super admin user.'
|
81
116
|
password: 'Passwords must contain at least 8 characters.'
|
82
117
|
options:
|
83
118
|
project_name: 'Project Name'
|
84
119
|
live_url: 'Live URL'
|
120
|
+
colorway: 'Highlight Color'
|
121
|
+
colorway_helper: 'Use 6 digit hex code to set the highlight color. Omit the "#"'
|
85
122
|
url_helper: 'Include http:// for external links.'
|
86
123
|
stage_url: 'Stage URL'
|
87
124
|
logo_helper: 'Used on login page, 300x300px .jpg'
|
88
125
|
images:
|
89
|
-
alt_helper: '
|
126
|
+
alt_helper: 'Read by search engines and visually impaired readers.'
|
90
127
|
application:
|
128
|
+
activity_log_heading: 'Activity Log'
|
91
129
|
user_absent: 'user no longer exists'
|
92
130
|
no_logs: 'No logs available.'
|
93
131
|
view_site: 'View Site'
|
@@ -111,9 +149,16 @@ en:
|
|
111
149
|
paragraph_break: 'Paragraph break'
|
112
150
|
paragraph_break_help: 'Adding a blank line in between your paragraphs makes a paragraph break.'
|
113
151
|
seo_title: 'A descriptive page title of ~50-65 characters. Displayed in search engine results.'
|
114
|
-
seo_description: 'A helpful page summary of
|
152
|
+
seo_description: 'A helpful page summary of 200 characters or less. Displayed in search engine results.'
|
115
153
|
search: 'Search %{search}'
|
116
154
|
reset_search: 'Reset Search'
|
117
155
|
apply_filters: 'Apply Filters'
|
118
156
|
all_items: 'All %{items}'
|
119
|
-
keyword_search: 'Search by Keyword'
|
157
|
+
keyword_search: 'Search by Keyword'
|
158
|
+
activerecord:
|
159
|
+
errors:
|
160
|
+
models:
|
161
|
+
fae/image:
|
162
|
+
attributes:
|
163
|
+
asset:
|
164
|
+
size_too_big: 'size is too big'
|
@@ -41,7 +41,7 @@ zh-CN:
|
|
41
41
|
error_end: 'to be taken to our home page.'
|
42
42
|
hello: 'Hello'
|
43
43
|
welcome: 'Welcome to Fae'
|
44
|
-
no_objs_start: "You don'
|
44
|
+
no_objs_start: "You don't have any objects setup to manage. If you need help getting started, check out the"
|
45
45
|
no_objs_end: 'Quickstart Guide and Documentation site.'
|
46
46
|
navbar:
|
47
47
|
logout: 'Log Out'
|
@@ -86,7 +86,7 @@ zh-CN:
|
|
86
86
|
stage_url: 'Stage URL'
|
87
87
|
logo_helper: 'Used on login page, 300x300px .jpg'
|
88
88
|
images:
|
89
|
-
alt_helper: '
|
89
|
+
alt_helper: 'Read by search engines and visually impaired readers.'
|
90
90
|
application:
|
91
91
|
user_absent: 'user no longer exists'
|
92
92
|
no_logs: 'No logs available.'
|
data/config/puma.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# Puma can serve each request in a thread from an internal thread pool.
|
2
|
+
# The `threads` method setting takes two numbers: a minimum and maximum.
|
3
|
+
# Any libraries that use thread pools should be configured to match
|
4
|
+
# the maximum value specified for Puma. Default is set to 5 threads for minimum
|
5
|
+
# and maximum; this matches the default thread size of Active Record.
|
6
|
+
#
|
7
|
+
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
|
8
|
+
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
|
9
|
+
threads min_threads_count, max_threads_count
|
10
|
+
|
11
|
+
# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
|
12
|
+
#
|
13
|
+
port ENV.fetch("PORT") { 3000 }
|
14
|
+
|
15
|
+
# Specifies the `environment` that Puma will run in.
|
16
|
+
#
|
17
|
+
environment ENV.fetch("RAILS_ENV") { "development" }
|
18
|
+
|
19
|
+
# Specifies the `pidfile` that Puma will use.
|
20
|
+
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
|
21
|
+
|
22
|
+
# Specifies the number of `workers` to boot in clustered mode.
|
23
|
+
# Workers are forked web server processes. If using threads and workers together
|
24
|
+
# the concurrency of the application would be max `threads` * `workers`.
|
25
|
+
# Workers do not work on JRuby or Windows (both of which do not support
|
26
|
+
# processes).
|
27
|
+
#
|
28
|
+
workers ENV.fetch("WEB_CONCURRENCY") { 4 }
|
29
|
+
# Use the `preload_app!` method when specifying a `workers` number.
|
30
|
+
# This directive tells Puma to first boot the application and load code
|
31
|
+
# before forking the application. This takes advantage of Copy On Write
|
32
|
+
# process behavior so workers use less memory.
|
33
|
+
#
|
34
|
+
preload_app!
|
35
|
+
# Allow puma to be restarted by `rails restart` command.
|
36
|
+
plugin :tmp_restart
|
37
|
+
|
38
|
+
# Old setup for fly.io
|
39
|
+
|
40
|
+
# # Puma can serve each request in a thread from an internal thread pool.
|
41
|
+
# # The `threads` method setting takes two numbers: a minimum and maximum.
|
42
|
+
# # Any libraries that use thread pools should be configured to match
|
43
|
+
# # the maximum value specified for Puma. Default is set to 5 threads for minimum
|
44
|
+
# # and maximum; this matches the default thread size of Active Record.
|
45
|
+
# #
|
46
|
+
# max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
|
47
|
+
# min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
|
48
|
+
# threads min_threads_count, max_threads_count
|
49
|
+
|
50
|
+
# # Specifies the `worker_timeout` threshold that Puma will use to wait before
|
51
|
+
# # terminating a worker in development environments.
|
52
|
+
# #
|
53
|
+
# worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development"
|
54
|
+
|
55
|
+
# # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
|
56
|
+
# #
|
57
|
+
# port ENV.fetch("PORT") { 3000 }
|
58
|
+
|
59
|
+
# # Specifies the `environment` that Puma will run in.
|
60
|
+
# #
|
61
|
+
# environment ENV.fetch("RAILS_ENV") { "development" }
|
62
|
+
|
63
|
+
# # Specifies the `pidfile` that Puma will use.
|
64
|
+
# pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
|
65
|
+
|
66
|
+
# # Specifies the number of `workers` to boot in clustered mode.
|
67
|
+
# # Workers are forked web server processes. If using threads and workers together
|
68
|
+
# # the concurrency of the application would be max `threads` * `workers`.
|
69
|
+
# # Workers do not work on JRuby or Windows (both of which do not support
|
70
|
+
# # processes).
|
71
|
+
# #
|
72
|
+
# workers ENV.fetch("WEB_CONCURRENCY") { 4 }
|
73
|
+
|
74
|
+
# # Use the `preload_app!` method when specifying a `workers` number.
|
75
|
+
# # This directive tells Puma to first boot the application and load code
|
76
|
+
# # before forking the application. This takes advantage of Copy On Write
|
77
|
+
# # process behavior so workers use less memory.
|
78
|
+
# #
|
79
|
+
# preload_app!
|
80
|
+
|
81
|
+
# # Allow puma to be restarted by `bin/rails restart` command.
|
82
|
+
# plugin :tmp_restart
|