Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/refactor custom fields (WIP) #1036

Open
wants to merge 23 commits into
base: feature/version-3
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
23ac241
feat: unify post_type reference name
owen2345 Jan 5, 2023
015f657
feat: add the ability to calc the category tree path
owen2345 Jan 5, 2023
a5f5574
feat: improve the way to fetch and create custom field groups for posts
owen2345 Jan 5, 2023
10e0f95
feat: improve the way to fetch field groups for post-types
owen2345 Jan 5, 2023
deec5d3
feat: refactor custom fields finder and creator to remove related to …
owen2345 Jan 5, 2023
32f5cb0
refactor: move user method to the corresponding place
owen2345 Jan 5, 2023
0d62cfa
revert me
owen2345 Jan 5, 2023
3c72524
feat: configure docker for testing the gem
owen2345 Jan 8, 2023
2102ee5
feat: update test settings to run test
owen2345 Jan 8, 2023
5bec2a0
fix: update default test command
owen2345 Jan 8, 2023
da8fec6
feat: refactor post and post_type the way to fetch and create custom …
owen2345 Jan 8, 2023
2bc09c8
test: fix failed test
owen2345 Jan 8, 2023
4c0be8f
Merge branch 'feature/version-3' of github.com:owen2345/camaleon-cms …
owen2345 Jan 8, 2023
e6bba39
feat: refactor fields form
owen2345 Jan 31, 2023
cc8fbe1
feat: refactor fields renderer to use the new fields structure
owen2345 Jan 31, 2023
aefa82f
refactor: pass received property values
owen2345 Jan 31, 2023
6924082
feat: refactor taxonomies and metas to use STI and polymorphism
owen2345 Jan 31, 2023
919f4f1
feat: add a task to migrate content from old structure to the new str…
owen2345 Jan 31, 2023
8ebe458
feat: improve performance by preloading
owen2345 Jan 31, 2023
a7d3e70
feat: refactor field groups manager to receive and save the new struc…
owen2345 Jan 31, 2023
e475cd0
feat: remove non used code
owen2345 Jan 31, 2023
8bcfd68
feat: add memoist dependency to cache results (TODO: remove custom me…
owen2345 Jan 31, 2023
4b055b4
test: update fields factories
owen2345 Jan 31, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 31 additions & 37 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,40 +1,34 @@
## BUILDING
## (from project root directory)
## $ docker build -t owen2345-camaleon-cms .
##
## RUNNING
## $ docker run -p 3000:3000 owen2345-camaleon-cms
##
## CONNECTING
## Lookup the IP of your active docker host using:
## $ docker-machine ip $(docker-machine active)
## Connect to the container at DOCKER_IP:3000
## replacing DOCKER_IP for the IP of your active docker host

FROM gcr.io/stacksmith-images/ubuntu-buildpack:14.04-r07

MAINTAINER Bitnami <containers@bitnami.com>

ENV STACKSMITH_STACK_ID="ujruqvm" \
STACKSMITH_STACK_NAME="owen2345/camaleon-cms" \
STACKSMITH_STACK_PRIVATE="1"

RUN bitnami-pkg install ruby-2.3.1-1 --checksum a81395976c85e8b7c8da3c1db6385d0e909bd05d9a3c1527f8fa36b8eb093d84

ENV PATH=/opt/bitnami/ruby/bin:$PATH

## STACKSMITH-END: Modifications below this line will be unchanged when regenerating

# Ruby on Rails template
ENV RAILS_ENV=development

COPY Gemfile* /app/
FROM ruby:3.1-slim as builder
RUN apt-get update && apt-get install curl gnupg build-essential libpq-dev -y
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq
RUN apt install yarn -y
RUN apt-get install imagemagick -y

RUN mkdir /app
WORKDIR /app

RUN bundle install --without production

COPY . /app

# Default port and web server command
EXPOSE 3000

CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", "3000"]
CMD ["bundle exec rspec"]

##################################### (Development)
# install google chrome
RUN apt-get install wget -y
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

#COPY package.json yarn.lock /app/
#RUN yarn install
COPY Gemfile* camaleon_cms.gemspec /app/
COPY lib/camaleon_cms/version.rb /app/lib/camaleon_cms/
RUN bundle install --jobs 20 --retry 5
COPY . /app
3 changes: 2 additions & 1 deletion app/apps/plugins/front_cache/config/initializer.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
if(CamaleonCms::Site.any? rescue false)
pending_migrations = ActiveRecord::Base.connection.migration_context.needs_migration?
if (CamaleonCms::Site.any? rescue false) && !pending_migrations
CamaleonCms::Site.all.each do |site|
site.set_option("refresh_cache", true)
end
Expand Down
1 change: 0 additions & 1 deletion app/apps/themes/new/custom_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ def theme_custom_on_install_theme(theme)
end

def theme_custom_on_uninstall_theme(theme)
theme.get_field_groups().destroy_all
theme.destroy
end
end
27 changes: 20 additions & 7 deletions app/assets/javascripts/camaleon_cms/admin/_custom_fields.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,31 @@ function build_custom_field_group(field_values, group_id, fields_data, is_repeat

function add_group(values){
var clone = group_clone.clone();
clone.find('input, textarea, select').not('.code_style').each(function(){ $(this).attr('name', $(this).attr('name').replace(field_name_group, field_name_group+'['+field_group_counter+']')) });
group_panel_body.append(clone);
group_panel.trigger('update_custom_group_number');
for(var k in fields_data){
cama_build_custom_field(clone.find('.content-field-'+fields_data[k].id), fields_data[k], values[k]);
}
if(field_group_counter == 0) clone.children('.header-field-grouped').find('.del').remove();
field_group_counter ++;
clone.children('.header-field-grouped').find('.del').remove();
clone.bind('update_fields_name', function(ev, groupNo) {
var group = $(this);
var oldNo = group.attr('data-group-no');
var groupNo = groupNo == undefined ? oldNo : groupNo;
var newName = field_name_group+'['+groupNo+']';
var fields = group.find('input, textarea, select').not('.code_style');
fields.each(function(){
var oldName = $(this).attr('data-input-renamed') ? `${field_name_group}[${oldNo}]` : field_name_group;
$(this).attr('data-input-renamed', true).attr('name', $(this).attr('name').replace(oldName, newName));
});
group.attr('data-group-no', groupNo);
});
clone.trigger('update_fields_name', [field_group_counter += 1]);
return false;
}

group_panel.bind('update_custom_group_number', function(){
$(this).find('.custom_sortable_grouped').each(function(index){ $(this).trigger('update_fields_name', [index]); });
});

if(is_repeat){
group_panel_body.sortable({ handle: ".move.fa-arrows", items: ' > .custom_sortable_grouped',
update: function(){ group_panel.trigger('update_custom_group_number'); },
Expand All @@ -34,13 +48,12 @@ function build_custom_field_group(field_values, group_id, fields_data, is_repeat
});
}});
group_panel.find('.btn.duplicate_cutom_group').click(add_group);
group_panel_body.on('click', '.header-field-grouped .del', function(){ if(confirm(I18n("msg.delete_item"))) $(this).closest('.custom_sortable_grouped').fadeOut('slow', function(){ $(this).remove(); group_panel.trigger('update_custom_group_number'); }); return false; });
group_panel_body.on('click', '.header-field-grouped .del', function(){ if(confirm(I18n("msg.delete_item"))) $(this).closest('.custom_sortable_grouped').fadeOut('slow', function(){ $(this).remove(); }); return false; });
group_panel_body.on('click', '.header-field-grouped .toggleable', function(){
if($(this).hasClass('fa-angle-down')) $(this).removeClass('fa-angle-down').addClass('fa-angle-up').closest('.header-field-grouped').next().slideUp();
else $(this).removeClass('fa-angle-up').addClass('fa-angle-down').closest('.header-field-grouped').next().slideDown();
return false;
});
group_panel.bind('update_custom_group_number', function(){ $(this).find('.custom_sortable_grouped').each(function(index){ $(this).find('input.cama_custom_group_number').val(index); }); });
$.each(field_values, function(field_val, key){ add_group(this); });
}else{
add_group(field_values[0]);
Expand All @@ -59,7 +72,6 @@ function cama_build_custom_field(panel, field_data, values){
var field = $field.clone(true);
if(field_data.multiple) {
field.prepend(field_actions);
if(field_counter == 0) field.children('.actions').find('.fa-times').remove();
}
if(!$field.find('.group-input-fields-content').hasClass('cama_skip_cf_rename_multiple')) {
field.find('input, textarea, select').each(function(){ $(this).attr('name', $(this).attr('name').replace('[]', '['+field_counter+']')) });
Expand All @@ -75,6 +87,7 @@ function cama_build_custom_field(panel, field_data, values){
field.find('.input-value').val(value).trigger('change', {field_rendered: true}).data('value', value);
}
$sortable.append(field);
panel.closest('.custom_sortable_grouped').trigger('update_fields_name');
if(callback) window[callback](field, value);
field_counter ++;
}
Expand Down
2 changes: 1 addition & 1 deletion app/assets/javascripts/camaleon_cms/admin/_translator.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ jQuery(function($){
var l = languages[ii];
var key = "translation-"+l+"-"+TRANSLATOR_counter;
tabs_title.push('<li role="presentation" class="pull-right '+(ii==0?"active":"")+'"><a href="#pane-'+key+'" role="tab" data-toggle="tab">'+ l.titleize()+'</a></li>');
var clone = ele.clone(true).attr({id: key, name: key, "data-name": key, 'data-translation_l': l, 'data-translation': "translation-"+l}).addClass("translate-item").val(get_translation(translations, l));
var clone = ele.clone(true).attr({id: key, name: '', "data-name": key, 'data-translation_l': l, 'data-translation': "translation-"+l}).addClass("translate-item").val(get_translation(translations, l));
if(ii > 0 && !clone.hasClass('required_all_langs')) clone.removeClass('required'); // to permit enter empty values for secondary languages
inputs[l] = clone;
clone.wrap("<div class='tab-pane "+class_group+" trans_tab_item "+(ii==0?"active":"")+"' id='pane-"+key+"'/>");
Expand Down
57 changes: 25 additions & 32 deletions app/assets/javascripts/camaleon_cms/admin/custom_fields_form.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// add actions to assign custom fields to any model selected
jQuery(function($){
var panel = $("#cama_custom_field_form");
var group_class_name = panel.attr("data-group_class_name");
var $content_fields = $( "#sortable-fields", panel);
$content_fields.sortable({
handle: ".panel-sortable"
Expand All @@ -28,54 +27,32 @@ jQuery(function($){
panel.on("click", ".panel-delete", function(){
var parent = $(this).parents(".item:first");
if(confirm(I18n("msg.delete_item"))){
parent.remove()
var check = parent.find('input.destroy_check');
if (check.length) {
parent.hide();
check[0].checked = true;
} else
parent.remove();
}
return false;
});

$('#select_assign_group', panel).change(function(){
var option = $(this).find('option:checked');
_change_additional_select(option);
var txt_help = option.data('help');
togglePostsDropdown(option.val() === '_post_simple');
if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
$('#select_assign_group_help', panel).html(txt_help);
$('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ' ' + option.text());
}).val(_search_group_class_name(group_class_name)).trigger('change');
});

$('#select_post_simple', panel).change(function(){
var option = $(this).find('option:checked');
var txt_help = option.data('help');
if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
$('#select_assign_group_help', panel).html(txt_help);
$('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ': ' + option.text());
}).val(group_class_name).trigger('change');

$('#select_category_simple', panel).change(function(){
var option = $(this).find('option:checked');
var txt_help = option.data('help');
if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
$('#select_assign_group_help', panel).html(txt_help);
$('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ': ' + option.text());
}).val(group_class_name).trigger('change');

function _change_additional_select(option){
var option_value = option.attr('value'),
additional_options = ['_post_simple', '_category_simple'];

for (key in additional_options) {
if (option_value === additional_options[key]){
$('#select'+additional_options[key], panel).show().removeAttr('disabled');
}else{
$('#select'+additional_options[key], panel).hide().attr('disabled','disabled');
}
}
}

function _search_group_class_name(group_class_name) {
if (group_class_name.search("Post,") == 0) group_class_name = '_post_simple';
if (group_class_name.search("Category_Post,") == 0) group_class_name = '_category_simple';
return group_class_name;
}
});

function cama_custom_field_set_slug(_panel){
$('.text-slug:not(.runned)', _panel || panel).each(function(){
Expand All @@ -91,4 +68,20 @@ jQuery(function($){
$(this).addClass('runned')
});
}

function applyCurrentSelected() {
var val = $('#select_assign_group', panel).attr('data-value');
var postOption = $('#select_post_simple', panel).find(`option[value='${val}']`).length;
var dropdown = $('#select_assign_group', panel);
postOption ? dropdown.val('_post_simple').trigger('change') : dropdown.val(val);
$('#select_post_simple', panel).val(val);
}

function togglePostsDropdown(flag) {
var dropdown = $('#select_post_simple', panel);
dropdown[0].disabled = !flag;
flag ? dropdown.show() : dropdown.hide();
}

applyCurrentSelected();
});
5 changes: 3 additions & 2 deletions app/controllers/camaleon_cms/admin/posts/drafts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ def create
@post_draft = @post_type.posts.new(@post_data) unless @post_draft.present?
r = {post: @post_draft, post_type: @post_type}; hooks_run("create_post_draft", r)
if @post_draft.save(:validate => false)
@post_draft.set_params(params[:meta], params[:field_options], @post_data[:keywords])
msg = {draft: {id: @post_draft.id}, _drafts_path: cama_admin_post_type_draft_path(@post_type.id, @post_draft)}
r = {post: @post_draft, post_type: @post_type}; hooks_run("created_post_draft", r)
else
Expand All @@ -31,7 +30,6 @@ def update
@post_draft.attributes = @post_data
r = {post: @post_draft, post_type: @post_type}; hooks_run("update_post_draft", r)
if @post_draft.save(validate: false)
@post_draft.set_params(params[:meta], params[:field_options], params[:options])
hooks_run("updated_post_draft", {post: @post_draft, post_type: @post_type})
msg = {draft: {id: @post_draft.id}}
else
Expand All @@ -53,6 +51,9 @@ def set_post_data_params
post_data[:user_id] = cama_current_user.id unless post_data[:user_id].present?
post_data[:data_tags] = params[:tags].to_s
post_data[:data_categories] = params[:categories] || []
post_data[:data_field_values] = params[:field_options]&.permit! || []
post_data[:data_options] = params[:options]&.permit! || {}
post_data[:data_metas] = params[:meta]&.permit! || {}
@post_data = post_data
end
end
15 changes: 6 additions & 9 deletions app/controllers/camaleon_cms/admin/posts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ class CamaleonCms::Admin::PostsController < CamaleonCms::AdminController
def index
authorize! :posts, @post_type
per_page = current_site.admin_per_page
posts_all = @post_type.posts.eager_load(:parent, :post_type)
posts_all = @post_type.posts.eager_load(:parent, :post_type).recent
if params[:taxonomy].present? && params[:taxonomy_id].present?
if params[:taxonomy] == "category"
cat_owner = current_site.full_categories.find(params[:taxonomy_id]).decorate
posts_all = cat_owner.posts
posts_all = cat_owner.posts.recent
add_breadcrumb t("camaleon_cms.admin.post_type.category"), @post_type.the_admin_url("category")
add_breadcrumb cat_owner.the_title, cat_owner.the_edit_url
end

if params[:taxonomy] == "post_tag"
tag_owner = current_site.post_tags.find(params[:taxonomy_id]).decorate
posts_all = tag_owner.posts
posts_all = tag_owner.posts.recent
add_breadcrumb t("camaleon_cms.admin.post_type.tags"), @post_type.the_admin_url("tag")
add_breadcrumb tag_owner.the_title, tag_owner.the_edit_url
end
Expand Down Expand Up @@ -77,9 +77,6 @@ def create
r = {post: @post, post_type: @post_type}; hooks_run("create_post", r)
@post = r[:post]
if @post.save
@post.set_metas(params[:meta])
@post.set_field_values(params[:field_options])
@post.set_options(params[:options])
flash[:notice] = t('camaleon_cms.admin.post.message.created', post_type: @post_type.decorate.the_title)
r = {post: @post, post_type: @post_type}; hooks_run("created_post", r)
redirect_to action: :edit, id: @post.id
Expand Down Expand Up @@ -116,9 +113,6 @@ def update
if @post.update(post_data)
# delete drafts only on successful update operation
@post.drafts.destroy_all if delete_drafts
@post.set_metas(params[:meta])
@post.set_field_values(params[:field_options])
@post.set_options(params[:options])
hooks_run("updated_post", {post: @post, post_type: @post_type})
flash[:notice] = t('camaleon_cms.admin.post.message.updated', post_type: @post_type.decorate.the_title)
redirect_to action: :edit, id: @post.id
Expand Down Expand Up @@ -207,6 +201,9 @@ def get_post_data(is_create = false)
post_data[:status] = 'pending' if post_data[:status] == 'published' && cannot?(:publish_post, @post_type)
post_data[:data_tags] = params[:tags].to_s
post_data[:data_categories] = params[:categories] || []
post_data[:data_field_values] = params[:field_options]&.permit! || []
post_data[:data_options] = params[:options]&.permit! || {}
post_data[:data_metas] = params[:meta]&.permit! || {}
post_data
end
end
Loading