From 2154edea9e4ce53d5e03a992136f6a331b46d21e Mon Sep 17 00:00:00 2001 From: Harry Bomrah Date: Mon, 21 Apr 2014 15:19:29 +0800 Subject: [PATCH] completed site structure with categories, data count, menu and link enabling and also re organizing the pages Conflicts: app/helpers/orbit_helper.rb --- Gemfile | 3 +- app/assets/images/chosen/chosen-sprite.png | Bin 0 -> 646 bytes app/assets/images/chosen/chosen-sprite@2x.png | Bin 0 -> 872 bytes app/assets/javascripts/lib/chosen.jquery.js | 1166 +++++++++++++++++ app/assets/javascripts/lib/items/items.js.erb | 104 +- app/assets/stylesheets/lib/chosen.css.erb | 430 ++++++ app/controllers/pages_controller.rb | 106 +- app/controllers/sessions_controller.rb | 2 +- app/helpers/application_helper.rb | 11 +- app/helpers/orbit_helper.rb | 19 +- app/models/concerns/filter.rb | 10 + app/models/page.rb | 36 +- app/views/admin/items/_node.html.erb | 13 +- .../admin/items/_node_and_children.html.erb | 4 +- app/views/admin/items/index.html.erb | 5 +- app/views/pages/_form.html.erb | 73 ++ app/views/pages/edit.html.erb | 8 + app/views/pages/new.html.erb | 22 +- app/views/pages/update.js | 3 + config/locales/en.yml | 2 + config/routes.rb | 2 + lib/orbit_category/categorizable.rb | 20 + public/404.html | 74 +- public/stylesheets/error-pages.css | 41 + 24 files changed, 2032 insertions(+), 122 deletions(-) create mode 100755 app/assets/images/chosen/chosen-sprite.png create mode 100755 app/assets/images/chosen/chosen-sprite@2x.png create mode 100644 app/assets/javascripts/lib/chosen.jquery.js create mode 100644 app/assets/stylesheets/lib/chosen.css.erb create mode 100644 app/models/concerns/filter.rb create mode 100644 app/views/pages/_form.html.erb create mode 100644 app/views/pages/edit.html.erb create mode 100644 app/views/pages/update.js create mode 100644 public/stylesheets/error-pages.css diff --git a/Gemfile b/Gemfile index 6743862..24dd92f 100644 --- a/Gemfile +++ b/Gemfile @@ -48,6 +48,8 @@ group :development do gem 'rb-fchange', :require=>false gem 'rb-fsevent', :require=>false gem 'rb-inotify', :require=>false + gem 'debugger', '>= 1.6.6', group: [:development, :test] + gem "binding_of_caller" end #testing gems @@ -56,4 +58,3 @@ group :test do gem 'minitest-spec-rails' end -gem 'debugger', '>= 1.6.6', group: [:development, :test] \ No newline at end of file diff --git a/app/assets/images/chosen/chosen-sprite.png b/app/assets/images/chosen/chosen-sprite.png new file mode 100755 index 0000000000000000000000000000000000000000..3611ae4ace1c4b1cbeacd6145b5a79cbc72e0bdc GIT binary patch literal 646 zcmV;10(t$3P)0006_Nkl&pbAC0n?)s%2x5M$#UgGxI1~gymp~v; zh<`zGaTJP5BybQY4tlRo;SIcmE0t>ueW3>*u6N;@_u;;|BoL8PuhZ#FWY9$(flan1oVvxDBL8~}0Q5z;^2p>Ov z7}Q$E7=l>$BZLUt1*uKMCaQwKYf$lsJCyerWMd+%BeGH6f_f&Vpy%=$BN%uK%Ahxi zF+%Jj=Pc-WXF;djSiJw|m4>cN%^Fi|FBZ!E{_yJLS?RI<3U696XLkQSs z{{&kQJ$K(#5CgC1;GbA>mjm56zJZ^-Hg2_ASKI_K@CybPh7Rq}8ud``)NM~eZx}qT z)oK?Lf>t!B;%Uh}*P+)Ef?jbx#w|BNEVb(l{2LK}m#fw4xx>ddF;&j}!S{N-e!<&Q z?kvzyI_AT@H-u4tUz1h&GCh8>?TnA~?BZ7WGP<9`r gQ6DuZO!_~60ju@{TzXF%TmS$707*qoM6N<$g2#CqL;wH) literal 0 HcmV?d00001 diff --git a/app/assets/images/chosen/chosen-sprite@2x.png b/app/assets/images/chosen/chosen-sprite@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..ffe4d7d1121ca45cd35783696940050c690a8676 GIT binary patch literal 872 zcmeAS@N?(olHy`uVBq!ia0vp^89?mC!3-o5mOWetq|OBRgt-3y{~yTgfB`oc01C8& zL0el}Lqh|Q1oD8A5J8A6G6@lfkU;ftMr&&;+$f+RkloVK0wm!8C|FWb0x`e2xj8g6 z6i7l;BAWwL4-tfu5G@ccP!{MmqnYOy06pVW666=m!0_*bfx(A_gav;C1PU5HKT!C5 z;g7@l4POuZ{>hQBP{j4uqq`I2WP9&Sn{}I8xJi*&v*QL&+Dw-Bf-CQLyLk0Ht2-;T zynum$iPO`?F{C2y?bYjfj|~J`6Xz~`vM4Ef+U{Vpli%)D%kKSey_RG0Bi9Xw4jtOb z@!)?~_%DVelO793W#Pl3vjdNCDTnGGb(^YY+BbF2;mJK!nq}@nBGoHxCn#7X*gdxr z+~ZQF6rpL6;MDP)JzehcJBL53AM-QU?@65Plc4-}1EW@`H@EEGrnFmTubZ~5iUzVn zrZYyBIm|RmW$3F@+wkq2)c>|mGh5Rv3%(p~zjStyruBl(TP2_51LpTH2noN*e&}J; z1;$+4EpJ(Mb+^1}Fv>ms%b`r}+KYy~zf5x(4?8l28%eNnEHzx({;NGP)_hX&tEw9t zSKv=Qjt(d#~b;F7hbDdUu$OUK8iumkkl&-=~$APCd2zdqHg6@=Z#Pt*5RY_s@Hw*YS9+ z^u)7AmzM6Ux!dus_!gJY)Vtf?+t>a3wO2S)_Vct=T}#@RuG(h!d8WYZS9Tst+VfKv zt~zntPsvfyqLY`klZSPslCz_dlcSRJLa$Px)_+W2Y&u!?oJrIMCNTz2S3j3^P6\"\'\`]/.test(text)) { + return text; + } + map = { + "<": "<", + ">": ">", + '"': """, + "'": "'", + "`": "`" + }; + unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g; + return text.replace(unsafe_chars, function(chr) { + return map[chr] || "&"; + }); + }; + + return SelectParser; + + })(); + + SelectParser.select_to_array = function(select) { + var child, parser, _i, _len, _ref; + + parser = new SelectParser(); + _ref = select.childNodes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + parser.add_node(child); + } + return parser.parsed; + }; + + AbstractChosen = (function() { + function AbstractChosen(form_field, options) { + this.form_field = form_field; + this.options = options != null ? options : {}; + if (!AbstractChosen.browser_is_supported()) { + return; + } + this.is_multiple = this.form_field.multiple; + this.set_default_text(); + this.set_default_values(); + this.setup(); + this.set_up_html(); + this.register_observers(); + } + + AbstractChosen.prototype.set_default_values = function() { + var _this = this; + + this.click_test_action = function(evt) { + return _this.test_active_click(evt); + }; + this.activate_action = function(evt) { + return _this.activate_field(evt); + }; + this.active_field = false; + this.mouse_on_container = false; + this.results_showing = false; + this.result_highlighted = null; + this.result_single_selected = null; + this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; + this.disable_search_threshold = this.options.disable_search_threshold || 0; + this.disable_search = this.options.disable_search || false; + this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; + this.group_search = this.options.group_search != null ? this.options.group_search : true; + this.search_contains = this.options.search_contains || false; + this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; + this.max_selected_options = this.options.max_selected_options || Infinity; + this.inherit_select_classes = this.options.inherit_select_classes || false; + this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; + return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; + }; + + AbstractChosen.prototype.set_default_text = function() { + if (this.form_field.getAttribute("data-placeholder")) { + this.default_text = this.form_field.getAttribute("data-placeholder"); + } else if (this.is_multiple) { + this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; + } else { + this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; + } + return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; + }; + + AbstractChosen.prototype.mouse_enter = function() { + return this.mouse_on_container = true; + }; + + AbstractChosen.prototype.mouse_leave = function() { + return this.mouse_on_container = false; + }; + + AbstractChosen.prototype.input_focus = function(evt) { + var _this = this; + + if (this.is_multiple) { + if (!this.active_field) { + return setTimeout((function() { + return _this.container_mousedown(); + }), 50); + } + } else { + if (!this.active_field) { + return this.activate_field(); + } + } + }; + + AbstractChosen.prototype.input_blur = function(evt) { + var _this = this; + + if (!this.mouse_on_container) { + this.active_field = false; + return setTimeout((function() { + return _this.blur_test(); + }), 100); + } + }; + + AbstractChosen.prototype.results_option_build = function(options) { + var content, data, _i, _len, _ref; + + content = ''; + _ref = this.results_data; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + data = _ref[_i]; + if (data.group) { + content += this.result_add_group(data); + } else { + content += this.result_add_option(data); + } + if (options != null ? options.first : void 0) { + if (data.selected && this.is_multiple) { + this.choice_build(data); + } else if (data.selected && !this.is_multiple) { + this.single_set_selected_text(data.text); + } + } + } + return content; + }; + + AbstractChosen.prototype.result_add_option = function(option) { + var classes, style; + + if (!option.search_match) { + return ''; + } + if (!this.include_option_in_results(option)) { + return ''; + } + classes = []; + if (!option.disabled && !(option.selected && this.is_multiple)) { + classes.push("active-result"); + } + if (option.disabled && !(option.selected && this.is_multiple)) { + classes.push("disabled-result"); + } + if (option.selected) { + classes.push("result-selected"); + } + if (option.group_array_index != null) { + classes.push("group-option"); + } + if (option.classes !== "") { + classes.push(option.classes); + } + style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : ""; + return "
  • " + option.search_text + "
  • "; + }; + + AbstractChosen.prototype.result_add_group = function(group) { + if (!(group.search_match || group.group_match)) { + return ''; + } + if (!(group.active_options > 0)) { + return ''; + } + return "
  • " + group.search_text + "
  • "; + }; + + AbstractChosen.prototype.results_update_field = function() { + this.set_default_text(); + if (!this.is_multiple) { + this.results_reset_cleanup(); + } + this.result_clear_highlight(); + this.result_single_selected = null; + this.results_build(); + if (this.results_showing) { + return this.winnow_results(); + } + }; + + AbstractChosen.prototype.results_toggle = function() { + if (this.results_showing) { + return this.results_hide(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.results_search = function(evt) { + if (this.results_showing) { + return this.winnow_results(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.winnow_results = function() { + var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; + + this.no_results_clear(); + results = 0; + searchText = this.get_search_text(); + escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + regexAnchor = this.search_contains ? "" : "^"; + regex = new RegExp(regexAnchor + escapedSearchText, 'i'); + zregex = new RegExp(escapedSearchText, 'i'); + _ref = this.results_data; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + option.search_match = false; + results_group = null; + if (this.include_option_in_results(option)) { + if (option.group) { + option.group_match = false; + option.active_options = 0; + } + if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { + results_group = this.results_data[option.group_array_index]; + if (results_group.active_options === 0 && results_group.search_match) { + results += 1; + } + results_group.active_options += 1; + } + if (!(option.group && !this.group_search)) { + option.search_text = option.group ? option.label : option.html; + option.search_match = this.search_string_match(option.search_text, regex); + if (option.search_match && !option.group) { + results += 1; + } + if (option.search_match) { + if (searchText.length) { + startpos = option.search_text.search(zregex); + text = option.search_text.substr(0, startpos + searchText.length) + '' + option.search_text.substr(startpos + searchText.length); + option.search_text = text.substr(0, startpos) + '' + text.substr(startpos); + } + if (results_group != null) { + results_group.group_match = true; + } + } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { + option.search_match = true; + } + } + } + } + this.result_clear_highlight(); + if (results < 1 && searchText.length) { + this.update_results_content(""); + return this.no_results(searchText); + } else { + this.update_results_content(this.results_option_build()); + return this.winnow_results_set_highlight(); + } + }; + + AbstractChosen.prototype.search_string_match = function(search_string, regex) { + var part, parts, _i, _len; + + if (regex.test(search_string)) { + return true; + } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) { + parts = search_string.replace(/\[|\]/g, "").split(" "); + if (parts.length) { + for (_i = 0, _len = parts.length; _i < _len; _i++) { + part = parts[_i]; + if (regex.test(part)) { + return true; + } + } + } + } + }; + + AbstractChosen.prototype.choices_count = function() { + var option, _i, _len, _ref; + + if (this.selected_option_count != null) { + return this.selected_option_count; + } + this.selected_option_count = 0; + _ref = this.form_field.options; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + if (option.selected) { + this.selected_option_count += 1; + } + } + return this.selected_option_count; + }; + + AbstractChosen.prototype.choices_click = function(evt) { + evt.preventDefault(); + if (!(this.results_showing || this.is_disabled)) { + return this.results_show(); + } + }; + + AbstractChosen.prototype.keyup_checker = function(evt) { + var stroke, _ref; + + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; + this.search_field_scale(); + switch (stroke) { + case 8: + if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { + return this.keydown_backstroke(); + } else if (!this.pending_backstroke) { + this.result_clear_highlight(); + return this.results_search(); + } + break; + case 13: + evt.preventDefault(); + if (this.results_showing) { + return this.result_select(evt); + } + break; + case 27: + if (this.results_showing) { + this.results_hide(); + } + return true; + case 9: + case 38: + case 40: + case 16: + case 91: + case 17: + break; + default: + return this.results_search(); + } + }; + + AbstractChosen.prototype.container_width = function() { + if (this.options.width != null) { + return this.options.width; + } else { + return "" + this.form_field.offsetWidth + "px"; + } + }; + + AbstractChosen.prototype.include_option_in_results = function(option) { + if (this.is_multiple && (!this.display_selected_options && option.selected)) { + return false; + } + if (!this.display_disabled_options && option.disabled) { + return false; + } + if (option.empty) { + return false; + } + return true; + }; + + AbstractChosen.browser_is_supported = function() { + if (window.navigator.appName === "Microsoft Internet Explorer") { + return document.documentMode >= 8; + } + if (/iP(od|hone)/i.test(window.navigator.userAgent)) { + return false; + } + if (/Android/i.test(window.navigator.userAgent)) { + if (/Mobile/i.test(window.navigator.userAgent)) { + return false; + } + } + return true; + }; + + AbstractChosen.default_multiple_text = "Select Some Options"; + + AbstractChosen.default_single_text = "Select an Option"; + + AbstractChosen.default_no_result_text = "No results match"; + + return AbstractChosen; + + })(); + + $ = jQuery; + + $.fn.extend({ + chosen: function(options) { + if (!AbstractChosen.browser_is_supported()) { + return this; + } + return this.each(function(input_field) { + var $this, chosen; + + $this = $(this); + chosen = $this.data('chosen'); + if (options === 'destroy' && chosen) { + chosen.destroy(); + } else if (!chosen) { + $this.data('chosen', new Chosen(this, options)); + } + }); + } + }); + + Chosen = (function(_super) { + __extends(Chosen, _super); + + function Chosen() { + _ref = Chosen.__super__.constructor.apply(this, arguments); + return _ref; + } + + Chosen.prototype.setup = function() { + this.form_field_jq = $(this.form_field); + this.current_selectedIndex = this.form_field.selectedIndex; + return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl"); + }; + + Chosen.prototype.set_up_html = function() { + var container_classes, container_props; + + container_classes = ["chosen-container"]; + container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); + if (this.inherit_select_classes && this.form_field.className) { + container_classes.push(this.form_field.className); + } + if (this.is_rtl) { + container_classes.push("chosen-rtl"); + } + container_props = { + 'class': container_classes.join(' '), + 'style': "width: " + (this.container_width()) + ";", + 'title': this.form_field.title + }; + if (this.form_field.id.length) { + container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; + } + this.container = $("
    ", container_props); + if (this.is_multiple) { + this.container.html('
      '); + } else { + this.container.html('' + this.default_text + '
        '); + } + this.form_field_jq.hide().after(this.container); + this.dropdown = this.container.find('div.chosen-drop').first(); + this.search_field = this.container.find('input').first(); + this.search_results = this.container.find('ul.chosen-results').first(); + this.search_field_scale(); + this.search_no_results = this.container.find('li.no-results').first(); + if (this.is_multiple) { + this.search_choices = this.container.find('ul.chosen-choices').first(); + this.search_container = this.container.find('li.search-field').first(); + } else { + this.search_container = this.container.find('div.chosen-search').first(); + this.selected_item = this.container.find('.chosen-single').first(); + } + this.results_build(); + this.set_tab_index(); + this.set_label_behavior(); + return this.form_field_jq.trigger("chosen:ready", { + chosen: this + }); + }; + + Chosen.prototype.register_observers = function() { + var _this = this; + + this.container.bind('mousedown.chosen', function(evt) { + _this.container_mousedown(evt); + }); + this.container.bind('mouseup.chosen', function(evt) { + _this.container_mouseup(evt); + }); + this.container.bind('mouseenter.chosen', function(evt) { + _this.mouse_enter(evt); + }); + this.container.bind('mouseleave.chosen', function(evt) { + _this.mouse_leave(evt); + }); + this.search_results.bind('mouseup.chosen', function(evt) { + _this.search_results_mouseup(evt); + }); + this.search_results.bind('mouseover.chosen', function(evt) { + _this.search_results_mouseover(evt); + }); + this.search_results.bind('mouseout.chosen', function(evt) { + _this.search_results_mouseout(evt); + }); + this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) { + _this.search_results_mousewheel(evt); + }); + this.form_field_jq.bind("chosen:updated.chosen", function(evt) { + _this.results_update_field(evt); + }); + this.form_field_jq.bind("chosen:activate.chosen", function(evt) { + _this.activate_field(evt); + }); + this.form_field_jq.bind("chosen:open.chosen", function(evt) { + _this.container_mousedown(evt); + }); + this.search_field.bind('blur.chosen', function(evt) { + _this.input_blur(evt); + }); + this.search_field.bind('keyup.chosen', function(evt) { + _this.keyup_checker(evt); + }); + this.search_field.bind('keydown.chosen', function(evt) { + _this.keydown_checker(evt); + }); + this.search_field.bind('focus.chosen', function(evt) { + _this.input_focus(evt); + }); + if (this.is_multiple) { + return this.search_choices.bind('click.chosen', function(evt) { + _this.choices_click(evt); + }); + } else { + return this.container.bind('click.chosen', function(evt) { + evt.preventDefault(); + }); + } + }; + + Chosen.prototype.destroy = function() { + $(document).unbind("click.chosen", this.click_test_action); + if (this.search_field[0].tabIndex) { + this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; + } + this.container.remove(); + this.form_field_jq.removeData('chosen'); + return this.form_field_jq.show(); + }; + + Chosen.prototype.search_field_disabled = function() { + this.is_disabled = this.form_field_jq[0].disabled; + if (this.is_disabled) { + this.container.addClass('chosen-disabled'); + this.search_field[0].disabled = true; + if (!this.is_multiple) { + this.selected_item.unbind("focus.chosen", this.activate_action); + } + return this.close_field(); + } else { + this.container.removeClass('chosen-disabled'); + this.search_field[0].disabled = false; + if (!this.is_multiple) { + return this.selected_item.bind("focus.chosen", this.activate_action); + } + } + }; + + Chosen.prototype.container_mousedown = function(evt) { + if (!this.is_disabled) { + if (evt && evt.type === "mousedown" && !this.results_showing) { + evt.preventDefault(); + } + if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { + if (!this.active_field) { + if (this.is_multiple) { + this.search_field.val(""); + } + $(document).bind('click.chosen', this.click_test_action); + this.results_show(); + } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { + evt.preventDefault(); + this.results_toggle(); + } + return this.activate_field(); + } + } + }; + + Chosen.prototype.container_mouseup = function(evt) { + if (evt.target.nodeName === "ABBR" && !this.is_disabled) { + return this.results_reset(evt); + } + }; + + Chosen.prototype.search_results_mousewheel = function(evt) { + var delta, _ref1, _ref2; + + delta = -((_ref1 = evt.originalEvent) != null ? _ref1.wheelDelta : void 0) || ((_ref2 = evt.originialEvent) != null ? _ref2.detail : void 0); + if (delta != null) { + evt.preventDefault(); + if (evt.type === 'DOMMouseScroll') { + delta = delta * 40; + } + return this.search_results.scrollTop(delta + this.search_results.scrollTop()); + } + }; + + Chosen.prototype.blur_test = function(evt) { + if (!this.active_field && this.container.hasClass("chosen-container-active")) { + return this.close_field(); + } + }; + + Chosen.prototype.close_field = function() { + $(document).unbind("click.chosen", this.click_test_action); + this.active_field = false; + this.results_hide(); + this.container.removeClass("chosen-container-active"); + this.clear_backstroke(); + this.show_search_field_default(); + return this.search_field_scale(); + }; + + Chosen.prototype.activate_field = function() { + this.container.addClass("chosen-container-active"); + this.active_field = true; + this.search_field.val(this.search_field.val()); + return this.search_field.focus(); + }; + + Chosen.prototype.test_active_click = function(evt) { + if (this.container.is($(evt.target).closest('.chosen-container'))) { + return this.active_field = true; + } else { + return this.close_field(); + } + }; + + Chosen.prototype.results_build = function() { + this.parsing = true; + this.selected_option_count = null; + this.results_data = SelectParser.select_to_array(this.form_field); + if (this.is_multiple) { + this.search_choices.find("li.search-choice").remove(); + } else if (!this.is_multiple) { + this.single_set_selected_text(); + if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { + this.search_field[0].readOnly = true; + this.container.addClass("chosen-container-single-nosearch"); + } else { + this.search_field[0].readOnly = false; + this.container.removeClass("chosen-container-single-nosearch"); + } + } + this.update_results_content(this.results_option_build({ + first: true + })); + this.search_field_disabled(); + this.show_search_field_default(); + this.search_field_scale(); + return this.parsing = false; + }; + + Chosen.prototype.result_do_highlight = function(el) { + var high_bottom, high_top, maxHeight, visible_bottom, visible_top; + + if (el.length) { + this.result_clear_highlight(); + this.result_highlight = el; + this.result_highlight.addClass("highlighted"); + maxHeight = parseInt(this.search_results.css("maxHeight"), 10); + visible_top = this.search_results.scrollTop(); + visible_bottom = maxHeight + visible_top; + high_top = this.result_highlight.position().top + this.search_results.scrollTop(); + high_bottom = high_top + this.result_highlight.outerHeight(); + if (high_bottom >= visible_bottom) { + return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); + } else if (high_top < visible_top) { + return this.search_results.scrollTop(high_top); + } + } + }; + + Chosen.prototype.result_clear_highlight = function() { + if (this.result_highlight) { + this.result_highlight.removeClass("highlighted"); + } + return this.result_highlight = null; + }; + + Chosen.prototype.results_show = function() { + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("chosen:maxselected", { + chosen: this + }); + return false; + } + this.container.addClass("chosen-with-drop"); + this.form_field_jq.trigger("chosen:showing_dropdown", { + chosen: this + }); + this.results_showing = true; + this.search_field.focus(); + this.search_field.val(this.search_field.val()); + return this.winnow_results(); + }; + + Chosen.prototype.update_results_content = function(content) { + return this.search_results.html(content); + }; + + Chosen.prototype.results_hide = function() { + if (this.results_showing) { + this.result_clear_highlight(); + this.container.removeClass("chosen-with-drop"); + this.form_field_jq.trigger("chosen:hiding_dropdown", { + chosen: this + }); + } + return this.results_showing = false; + }; + + Chosen.prototype.set_tab_index = function(el) { + var ti; + + if (this.form_field.tabIndex) { + ti = this.form_field.tabIndex; + this.form_field.tabIndex = -1; + return this.search_field[0].tabIndex = ti; + } + }; + + Chosen.prototype.set_label_behavior = function() { + var _this = this; + + this.form_field_label = this.form_field_jq.parents("label"); + if (!this.form_field_label.length && this.form_field.id.length) { + this.form_field_label = $("label[for='" + this.form_field.id + "']"); + } + if (this.form_field_label.length > 0) { + return this.form_field_label.bind('click.chosen', function(evt) { + if (_this.is_multiple) { + return _this.container_mousedown(evt); + } else { + return _this.activate_field(); + } + }); + } + }; + + Chosen.prototype.show_search_field_default = function() { + if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { + this.search_field.val(this.default_text); + return this.search_field.addClass("default"); + } else { + this.search_field.val(""); + return this.search_field.removeClass("default"); + } + }; + + Chosen.prototype.search_results_mouseup = function(evt) { + var target; + + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target.length) { + this.result_highlight = target; + this.result_select(evt); + return this.search_field.focus(); + } + }; + + Chosen.prototype.search_results_mouseover = function(evt) { + var target; + + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target) { + return this.result_do_highlight(target); + } + }; + + Chosen.prototype.search_results_mouseout = function(evt) { + if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { + return this.result_clear_highlight(); + } + }; + + Chosen.prototype.choice_build = function(item) { + var choice, close_link, + _this = this; + + choice = $('
      • ', { + "class": "search-choice" + }).html("" + item.html + ""); + if (item.disabled) { + choice.addClass('search-choice-disabled'); + } else { + close_link = $('', { + "class": 'search-choice-close', + 'data-option-array-index': item.array_index + }); + close_link.bind('click.chosen', function(evt) { + return _this.choice_destroy_link_click(evt); + }); + choice.append(close_link); + } + return this.search_container.before(choice); + }; + + Chosen.prototype.choice_destroy_link_click = function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + if (!this.is_disabled) { + return this.choice_destroy($(evt.target)); + } + }; + + Chosen.prototype.choice_destroy = function(link) { + if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { + this.show_search_field_default(); + if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { + this.results_hide(); + } + link.parents('li').first().remove(); + return this.search_field_scale(); + } + }; + + Chosen.prototype.results_reset = function() { + this.form_field.options[0].selected = true; + this.selected_option_count = null; + this.single_set_selected_text(); + this.show_search_field_default(); + this.results_reset_cleanup(); + this.form_field_jq.trigger("change"); + if (this.active_field) { + return this.results_hide(); + } + }; + + Chosen.prototype.results_reset_cleanup = function() { + this.current_selectedIndex = this.form_field.selectedIndex; + return this.selected_item.find("abbr").remove(); + }; + + Chosen.prototype.result_select = function(evt) { + var high, item, selected_index; + + if (this.result_highlight) { + high = this.result_highlight; + this.result_clear_highlight(); + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("chosen:maxselected", { + chosen: this + }); + return false; + } + if (this.is_multiple) { + high.removeClass("active-result"); + } else { + if (this.result_single_selected) { + this.result_single_selected.removeClass("result-selected"); + selected_index = this.result_single_selected[0].getAttribute('data-option-array-index'); + this.results_data[selected_index].selected = false; + } + this.result_single_selected = high; + } + high.addClass("result-selected"); + item = this.results_data[high[0].getAttribute("data-option-array-index")]; + item.selected = true; + this.form_field.options[item.options_index].selected = true; + this.selected_option_count = null; + if (this.is_multiple) { + this.choice_build(item); + } else { + this.single_set_selected_text(item.text); + } + if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { + this.results_hide(); + } + this.search_field.val(""); + if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { + this.form_field_jq.trigger("change", { + 'selected': this.form_field.options[item.options_index].value + }); + } + this.current_selectedIndex = this.form_field.selectedIndex; + return this.search_field_scale(); + } + }; + + Chosen.prototype.single_set_selected_text = function(text) { + if (text == null) { + text = this.default_text; + } + if (text === this.default_text) { + this.selected_item.addClass("chosen-default"); + } else { + this.single_deselect_control_build(); + this.selected_item.removeClass("chosen-default"); + } + return this.selected_item.find("span").text(text); + }; + + Chosen.prototype.result_deselect = function(pos) { + var result_data; + + result_data = this.results_data[pos]; + if (!this.form_field.options[result_data.options_index].disabled) { + result_data.selected = false; + this.form_field.options[result_data.options_index].selected = false; + this.selected_option_count = null; + this.result_clear_highlight(); + if (this.results_showing) { + this.winnow_results(); + } + this.form_field_jq.trigger("change", { + deselected: this.form_field.options[result_data.options_index].value + }); + this.search_field_scale(); + return true; + } else { + return false; + } + }; + + Chosen.prototype.single_deselect_control_build = function() { + if (!this.allow_single_deselect) { + return; + } + if (!this.selected_item.find("abbr").length) { + this.selected_item.find("span").first().after(""); + } + return this.selected_item.addClass("chosen-single-with-deselect"); + }; + + Chosen.prototype.get_search_text = function() { + if (this.search_field.val() === this.default_text) { + return ""; + } else { + return $('
        ').text($.trim(this.search_field.val())).html(); + } + }; + + Chosen.prototype.winnow_results_set_highlight = function() { + var do_high, selected_results; + + selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; + do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); + if (do_high != null) { + return this.result_do_highlight(do_high); + } + }; + + Chosen.prototype.no_results = function(terms) { + var no_results_html; + + no_results_html = $('
      • ' + this.results_none_found + ' ""
      • '); + no_results_html.find("span").first().html(terms); + return this.search_results.append(no_results_html); + }; + + Chosen.prototype.no_results_clear = function() { + return this.search_results.find(".no-results").remove(); + }; + + Chosen.prototype.keydown_arrow = function() { + var next_sib; + + if (this.results_showing && this.result_highlight) { + next_sib = this.result_highlight.nextAll("li.active-result").first(); + if (next_sib) { + return this.result_do_highlight(next_sib); + } + } else { + return this.results_show(); + } + }; + + Chosen.prototype.keyup_arrow = function() { + var prev_sibs; + + if (!this.results_showing && !this.is_multiple) { + return this.results_show(); + } else if (this.result_highlight) { + prev_sibs = this.result_highlight.prevAll("li.active-result"); + if (prev_sibs.length) { + return this.result_do_highlight(prev_sibs.first()); + } else { + if (this.choices_count() > 0) { + this.results_hide(); + } + return this.result_clear_highlight(); + } + } + }; + + Chosen.prototype.keydown_backstroke = function() { + var next_available_destroy; + + if (this.pending_backstroke) { + this.choice_destroy(this.pending_backstroke.find("a").first()); + return this.clear_backstroke(); + } else { + next_available_destroy = this.search_container.siblings("li.search-choice").last(); + if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { + this.pending_backstroke = next_available_destroy; + if (this.single_backstroke_delete) { + return this.keydown_backstroke(); + } else { + return this.pending_backstroke.addClass("search-choice-focus"); + } + } + } + }; + + Chosen.prototype.clear_backstroke = function() { + if (this.pending_backstroke) { + this.pending_backstroke.removeClass("search-choice-focus"); + } + return this.pending_backstroke = null; + }; + + Chosen.prototype.keydown_checker = function(evt) { + var stroke, _ref1; + + stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; + this.search_field_scale(); + if (stroke !== 8 && this.pending_backstroke) { + this.clear_backstroke(); + } + switch (stroke) { + case 8: + this.backstroke_length = this.search_field.val().length; + break; + case 9: + if (this.results_showing && !this.is_multiple) { + this.result_select(evt); + } + this.mouse_on_container = false; + break; + case 13: + evt.preventDefault(); + break; + case 38: + evt.preventDefault(); + this.keyup_arrow(); + break; + case 40: + evt.preventDefault(); + this.keydown_arrow(); + break; + } + }; + + Chosen.prototype.search_field_scale = function() { + var div, f_width, h, style, style_block, styles, w, _i, _len; + + if (this.is_multiple) { + h = 0; + w = 0; + style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; + styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; + for (_i = 0, _len = styles.length; _i < _len; _i++) { + style = styles[_i]; + style_block += style + ":" + this.search_field.css(style) + ";"; + } + div = $('
        ', { + 'style': style_block + }); + div.text(this.search_field.val()); + $('body').append(div); + w = div.width() + 25; + div.remove(); + f_width = this.container.outerWidth(); + if (w > f_width - 10) { + w = f_width - 10; + } + return this.search_field.css({ + 'width': w + 'px' + }); + } + }; + + return Chosen; + + })(AbstractChosen); + +}).call(this); diff --git a/app/assets/javascripts/lib/items/items.js.erb b/app/assets/javascripts/lib/items/items.js.erb index 5e02910..8e10bd9 100755 --- a/app/assets/javascripts/lib/items/items.js.erb +++ b/app/assets/javascripts/lib/items/items.js.erb @@ -2,26 +2,122 @@ var Items = function(){ var i = this; this.initialize = function(){ i.bindHandlers(); + i.itemQuantity(); + i.bindEditAddPageHandlers(); } this.bindHandlers = function(){ var $openSlide = $('.open-slide'), - $pageslideW; - $(window).width() > 1440 ? $pageslideW = 1024 : $pageslideW = 954; - $(window).resize(function() { + $pageslideW = $(window).width() > 1440 ? 1024 : 954; + $(window).resize(function() { $(this).width() > 1440 ? $pageslideW = 1024 : $pageslideW = 954; }); $iFrame = $openSlide.filter('.view-page.open-slide'); $iFrame.pageslide({ W: $pageslideW, iframe: true - }); + }); + $('.sortable').nestedSortable({ + handle: '.brand', + items: 'li', + maxLevels: 3, + opacity: .6, + disableNesting: 'no-nest', + toleranceElement: '> div', + placeholder: 'placeholder', + startCollapsed: true, + update: function(event, ui) { + var parent = (ui.item.parent().closest('li').length ? ui.item.parent().closest('li') : ui.item.parent().closest('ol')), + children = (parent.hasClass("root") ? parent.find(">li") : parent.find(">ol li")), + children_ids = []; + children.each(function(){ + children_ids.push($(this).attr("id")); + }) + $.ajax({ + url : "<%= Rails.application.routes.url_helpers.pages_update_item_position_path %>", + data : {"parent_id" : parent.attr("id"), "id" : ui.item.attr("id"),"children_ids" : children_ids}, + dataType : "json", + type : "post" + }) + } + }); } + + this.itemQuantity = function(){ + + var $sortable = $('.sortable'), + $host = $sortable.children('.navbar').eq(0), + $navbar = $('.sortable li').children('.navbar'), + $quantity = $sortable.find('li').length; + $host.find('.badge').text($quantity); + $navbar.each(function(i) { + if($navbar.eq(i).next('ol').length>0) { + var $amount = $navbar.eq(i).next('ol').find('li').length; + $navbar.eq(i).find('.badge').text($amount); + }else{ + $navbar.eq(i).find('.badge').text('0'); + } + $navbar.eq(i).find('.badge').text()>0 ? $navbar.eq(i).find('.badge').addClass('badge-info'):$navbar.eq(i).find('.badge').removeClass('badge-info'); + }) + + } + this.reBindHandlers = function(){ $.pageslide.close(); window.openSlide(); i.bindHandlers(); } + + this.bindEditAddPageHandlers = function(){ + var sidePanel = $(".view-page .content"); + + sidePanel.on("click","#categories_list input[type=checkbox]",function(){ + if($(this).is(":checked") && $(this).hasClass("checkbox-all")){ + $(".view-page .content #categories_list input[type=checkbox]").not($(this)).removeAttr("checked"); + }else{ + $(".view-page .content #categories_list input[type=checkbox].checkbox-all").removeAttr("checked"); + } + }) + + sidePanel.on("click","#enable-menu .main-enable-parent",function(e){ + if(!$(this).is(":checked")){ + $(this).parent().parent().find(".main-enable-child").removeAttr("checked"); + } + }) + + sidePanel.on("click","#enable-menu .main-enable-child",function(e){ + if(!$("input[for=checkbox_for_"+ $(this).val() +"]").is(":checked")){ + $(this).removeAttr("checked"); + } + }) + + sidePanel.on("change","select.module_select", function(){ + var this_value = $(this).val(), + categories_list = $("#categories_list"); + + categories_list.html(""); + if(this_value){ + $.ajax({ + url : "<%= Rails.application.routes.url_helpers.pages_get_categories_path %>", + data : {"module" : this_value}, + type : "get", + dataType : "json" + }).done(function(categories){ + var controlDiv = $("
        "); + if(categories.categories.length){ + categories_list.parent().find("label.control-label").prepend("Category List :"); + var checkbox = $(""); + controlDiv.append(checkbox); + } + $.each(categories.categories,function(i,category){ + var checkbox = $(""); + controlDiv.append(checkbox); + }) + categories_list.append(controlDiv); + }) + } + }) + } i.initialize(); } diff --git a/app/assets/stylesheets/lib/chosen.css.erb b/app/assets/stylesheets/lib/chosen.css.erb new file mode 100644 index 0000000..201fae5 --- /dev/null +++ b/app/assets/stylesheets/lib/chosen.css.erb @@ -0,0 +1,430 @@ +/* @group Base */ +.chosen-container { + position: relative; + display: inline-block; + vertical-align: middle; + font-size: 13px; + zoom: 1; + *display: inline; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.chosen-container .chosen-drop { + position: absolute; + top: 100%; + left: -9999px; + z-index: 1010; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + border: 1px solid #aaa; + border-top: 0; + background: #fff; + box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); +} +.chosen-container.chosen-with-drop .chosen-drop { + left: 0; +} +.chosen-container a { + cursor: pointer; +} + +/* @end */ +/* @group Single Chosen */ +.chosen-container-single .chosen-single { + position: relative; + display: block; + overflow: hidden; + padding: 0 0 0 8px; + height: 23px; + border: 1px solid #aaa; + border-radius: 5px; + background-color: #fff; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); + background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-clip: padding-box; + box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); + color: #444; + text-decoration: none; + white-space: nowrap; + line-height: 24px; +} +.chosen-container-single .chosen-default { + color: #999; +} +.chosen-container-single .chosen-single span { + display: block; + overflow: hidden; + margin-right: 26px; + text-overflow: ellipsis; + white-space: nowrap; +} +.chosen-container-single .chosen-single-with-deselect span { + margin-right: 38px; +} +.chosen-container-single .chosen-single abbr { + position: absolute; + top: 6px; + right: 26px; + display: block; + width: 12px; + height: 12px; + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-single .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single.chosen-disabled .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single .chosen-single div { + position: absolute; + top: 0; + right: 0; + display: block; + width: 18px; + height: 100%; +} +.chosen-container-single .chosen-single div b { + display: block; + width: 100%; + height: 100%; + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat 0px 2px; +} +.chosen-container-single .chosen-search { + position: relative; + z-index: 1010; + margin: 0; + padding: 3px 4px; + white-space: nowrap; +} +.chosen-container-single .chosen-search input[type="text"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin: 1px 0; + padding: 4px 20px 4px 5px; + width: 100%; + height: auto; + outline: 0; + border: 1px solid #aaa; + background: white url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat 100% -20px; + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%); + font-size: 1em; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-single .chosen-drop { + margin-top: -1px; + border-radius: 0 0 4px 4px; + background-clip: padding-box; +} +.chosen-container-single.chosen-container-single-nosearch .chosen-search { + position: absolute; + left: -9999px; +} + +/* @end */ +/* @group Results */ +.chosen-container .chosen-results { + position: relative; + overflow-x: hidden; + overflow-y: auto; + margin: 0 4px 4px 0; + padding: 0 0 0 4px; + max-height: 240px; + -webkit-overflow-scrolling: touch; +} +.chosen-container .chosen-results li { + display: none; + margin: 0; + padding: 5px 6px; + list-style: none; + line-height: 15px; +} +.chosen-container .chosen-results li.active-result { + display: list-item; + cursor: pointer; +} +.chosen-container .chosen-results li.disabled-result { + display: list-item; + color: #ccc; + cursor: default; +} +.chosen-container .chosen-results li.highlighted { + background-color: #3875d7; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); + background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); + color: #fff; +} +.chosen-container .chosen-results li.no-results { + display: list-item; + background: #f4f4f4; +} +.chosen-container .chosen-results li.group-result { + display: list-item; + font-weight: bold; + cursor: default; +} +.chosen-container .chosen-results li.group-option { + padding-left: 15px; +} +.chosen-container .chosen-results li em { + font-style: normal; + text-decoration: underline; +} + +/* @end */ +/* @group Multi Chosen */ +.chosen-container-multi .chosen-choices { + position: relative; + overflow: hidden; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + width: 100%; + height: auto !important; + height: 1%; + border: 1px solid #aaa; + background-color: #fff; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(#eeeeee 1%, #ffffff 15%); + cursor: text; +} +.chosen-container-multi .chosen-choices li { + float: left; + list-style: none; +} +.chosen-container-multi .chosen-choices li.search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} +.chosen-container-multi .chosen-choices li.search-field input[type="text"] { + margin: 1px 0; + padding: 5px; + height: 15px; + outline: 0; + border: 0 !important; + background: transparent !important; + box-shadow: none; + color: #666; + font-size: 100%; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-multi .chosen-choices li.search-field .default { + color: #999; +} +.chosen-container-multi .chosen-choices li.search-choice { + position: relative; + margin: 3px 0 3px 5px; + padding: 3px 20px 3px 5px; + border: 1px solid #aaa; + border-radius: 3px; + background-color: #e4e4e4; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-clip: padding-box; + box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); + color: #333; + line-height: 13px; + cursor: default; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { + position: absolute; + top: 4px; + right: 3px; + display: block; + width: 12px; + height: 12px; + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-choices li.search-choice-disabled { + padding-right: 5px; + border: 1px solid #ccc; + background-color: #e4e4e4; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + color: #666; +} +.chosen-container-multi .chosen-choices li.search-choice-focus { + background: #d4d4d4; +} +.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-results { + margin: 0; + padding: 0; +} +.chosen-container-multi .chosen-drop .result-selected { + display: list-item; + color: #ccc; + cursor: default; +} + +/* @end */ +/* @group Active */ +.chosen-container-active .chosen-single { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active.chosen-with-drop .chosen-single { + border: 1px solid #aaa; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); + background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: linear-gradient(#eeeeee 20%, #ffffff 80%); + box-shadow: 0 1px 0 #fff inset; +} +.chosen-container-active.chosen-with-drop .chosen-single div { + border-left: none; + background: transparent; +} +.chosen-container-active.chosen-with-drop .chosen-single div b { + background-position: -18px 2px; +} +.chosen-container-active .chosen-choices { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active .chosen-choices li.search-field input[type="text"] { + color: #111 !important; +} + +/* @end */ +/* @group Disabled Support */ +.chosen-disabled { + opacity: 0.5 !important; + cursor: default; +} +.chosen-disabled .chosen-single { + cursor: default; +} +.chosen-disabled .chosen-choices .search-choice .search-choice-close { + cursor: default; +} + +/* @end */ +/* @group Right to Left */ +.chosen-rtl { + text-align: right; +} +.chosen-rtl .chosen-single { + overflow: visible; + padding: 0 8px 0 0; +} +.chosen-rtl .chosen-single span { + margin-right: 0; + margin-left: 26px; + direction: rtl; +} +.chosen-rtl .chosen-single-with-deselect span { + margin-left: 38px; +} +.chosen-rtl .chosen-single div { + right: auto; + left: 3px; +} +.chosen-rtl .chosen-single abbr { + right: auto; + left: 26px; +} +.chosen-rtl .chosen-choices li { + float: right; +} +.chosen-rtl .chosen-choices li.search-field input[type="text"] { + direction: rtl; +} +.chosen-rtl .chosen-choices li.search-choice { + margin: 3px 5px 3px 0; + padding: 3px 5px 3px 19px; +} +.chosen-rtl .chosen-choices li.search-choice .search-choice-close { + right: auto; + left: 4px; +} +.chosen-rtl.chosen-container-single-nosearch .chosen-search, +.chosen-rtl .chosen-drop { + left: 9999px; +} +.chosen-rtl.chosen-container-single .chosen-results { + margin: 0 0 4px 4px; + padding: 0 4px 0 0; +} +.chosen-rtl .chosen-results li.group-option { + padding-right: 15px; + padding-left: 0; +} +.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { + border-right: none; +} +.chosen-rtl .chosen-search input[type="text"] { + padding: 4px 5px 4px 20px; + background: white url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat -30px -20px; + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%); + background: url("<%= asset_path 'chosen/chosen-sprite.png' %>") no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%); + direction: rtl; +} +.chosen-rtl.chosen-container-single .chosen-single div b { + background-position: 6px 2px; +} +.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { + background-position: -12px 2px; +} + +/* @end */ +/* @group Retina compatibility */ +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { + .chosen-rtl .chosen-search input[type="text"], + .chosen-container-single .chosen-single abbr, + .chosen-container-single .chosen-single div b, + .chosen-container-single .chosen-search input[type="text"], + .chosen-container-multi .chosen-choices .search-choice .search-choice-close, + .chosen-container .chosen-results-scroll-down span, + .chosen-container .chosen-results-scroll-up span { + background-image: url("<%= asset_path 'chosen/chosen-sprite@2x.png' %>") !important; + background-size: 52px 37px !important; + background-repeat: no-repeat !important; + } +} +/* @end */ diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 3eea14b..7f9f63e 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -43,21 +43,58 @@ class PagesController < ApplicationController end page = Page.find_by_param(params[:page_id]) - module_app = page.module.downcase.pluralize - params[:target_controller] = "#{module_app}" - params[:url] = page.url + if !page.nil? + if page.enabled_for.include? I18n.locale.to_s + module_app = page.module.downcase.pluralize + params[:target_controller] = "#{module_app}" + params[:url] = page.url - @manifest = @key - @dataApi = nil + @manifest = @key + @dataApi = nil - OrbitHelper.set_params params - OrbitHelper.set_site_locale locale - - # render render_final_page("#{module_app}/#{params[:target_action]}",page) - render :html => render_final_page("#{module_app}/#{params[:target_action]}",page).html_safe + OrbitHelper.set_params params + OrbitHelper.set_site_locale locale + OrbitHelper.set_page_categories page.categories || [] + OrbitHelper.set_page_data_count page.data_count + + # render render_final_page("#{module_app}/#{params[:target_action]}",page) + render :html => render_final_page("#{module_app}/#{params[:target_action]}",page).html_safe + else + render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found + end + else + render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found + end end end + def update_item_position + @page = Page.find(params[:id]) + new_parent_page = Page.find(params[:parent_id]) + old_parent_page_id = @page.parent_page_id + @page.parent_page_id = new_parent_page.id + if new_parent_page.id != old_parent_page_id + url = (new_parent_page.url == "/" ? "" : new_parent_page.url) + @page.url = url + "/#{@page.page_id}" + end + @page.save + params["children_ids"].each_with_index do |child,i| + page = Page.find(child) + page.number = i + page.save + end + + if new_parent_page.id != old_parent_page_id + old_parent_page = Page.find(old_parent_page_id) + + old_parent_page.child_page.each_with_index do |page,i| + page.number = i + page.save + end + end + render :json => {"success"=>true}.to_json + end + def preview render render_final_page end @@ -70,7 +107,17 @@ class PagesController < ApplicationController end end - + def get_categories + module_app = ModuleApp.find_by_key(params[:module]); + @categories = module_app.categories.collect do |cat| + { + "title" => cat.title, + "id" => cat.id.to_s + } + end + + render :json => {"categories" => @categories}.to_json + end def new @page = Page.new @@ -79,6 +126,24 @@ class PagesController < ApplicationController end + def edit + @page = Page.find(params[:id]) + @pages = Page.where(:page_id.ne => "" , :page_id.exists => true) + @modules = ModuleApp.all + module_app = ModuleApp.find_by_key(@page.module); + @categories = module_app.categories + end + + def update + @page = Page.find(params[:id]) + @page.update_attributes(page_update_params) + @page.save + respond_to do |format| + format.js + end + + end + def create @page = Page.new(page_params) @page.save! @@ -153,19 +218,26 @@ class PagesController < ApplicationController end def page_params - if params[:page][:parent_page] == "" - params[:page][:parent_page] = nil - @url = "/#{params[:page][:page_id]}" - else + # if params[:page][:parent_page] == "" + # params[:page][:parent_page] = nil + # @url = "/#{params[:page][:page_id]}" + # else page = Page.find(params[:page][:parent_page]) page.url = page.url.nil? ? "" : page.url @url = page.url + "/#{params[:page][:page_id]}" - end - p = params.require(:page).permit(:number, :page_id, :module, :parent_page, name_translations: [:en, :zh_tw]) + # end + p = params.require(:page).permit(:number, :page_id, :module, :parent_page, :data_count, enabled_for: [], menu_enabled_for: [], categories: [], name_translations: [:en, :zh_tw]) p["url"] = @url p end + def page_update_params + p = params.require(:page).permit(:number, :page_id, :module, :parent_page, :data_count, enabled_for: [],menu_enabled_for: [], categories: [], name_translations: [:en, :zh_tw]) + p["enabled_for"] = p["enabled_for"] || [] + p["menu_enabled_for"] = p["menu_enabled_for"] || [] + p + end + def get_layout if request[:action] == "edit_view" page = Page.find(params[:id]) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index c3ffda6..9a0bbf5 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -10,7 +10,7 @@ class SessionsController < ApplicationController session[:user_id] = user.id redirect_to admin_dashboards_path, :notice => "Logged in!" else - flash.now.alert = "Invalid email or password" + flash.now.alert = "Invalid username or password" render "new" end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e425a06..b2e08a1 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -13,13 +13,13 @@ module ApplicationHelper def render_menu # json_file = File.read(File.join(Rails.root, 'public', "menu.json")) # @items = JSON.parse(json_file) - @pages = Page.where(:parent_page_id.ne => "" , :parent_page_id.exists => false).first.child_page + @pages = Page.where(:parent_page_id.ne => "" , :parent_page_id.exists => false).first.sorted_published_child_pages def create_json(pages) item = {} pages.each do |page| if page.child_page.size > 0 - item["#{page.name}"] = {"url"=> "/#{locale.to_s}" + page.url, "children"=>create_json(page.child_page)} + item["#{page.name}"] = {"url"=> "/#{locale.to_s}" + page.url, "children"=>create_json(page.sorted_published_child_pages)} else item["#{page.name}"] = {"url"=> "/#{locale.to_s}" + page.url} end @@ -27,7 +27,6 @@ module ApplicationHelper item end @items = create_json(@pages) - key = Template::KEY menu_file = File.open(File.join(Rails.root, 'app', 'templates', "#{key}", '/home/menu.html.erb')) doc = Nokogiri::HTML(menu_file, nil, "UTF-8") @@ -63,7 +62,7 @@ module ApplicationHelper items.each do |key,item| li = @menus_items[level].gsub("href_here",item["url"]) li = li.gsub("{{link_name}}",key) - if item["children"] + if item["children"] && !item["children"].empty? li = li.gsub("{{level}}",create_menu(item["children"],level + 1)) else li = li.gsub("{{level}}","") @@ -84,7 +83,7 @@ module ApplicationHelper doc = Nokogiri::HTML(file, nil, "UTF-8") file.close wrap_elements = doc.css("*[data-module]") - controller = "#{params[:target_controller].capitalize}Controller".classify.constantize.new + controller = "#{params[:target_controller].capitalize}_controller".classify.constantize.new data = controller.send("#{params[:target_action]}") keys = data.keys wrap_elements.each do |wrap_element| @@ -115,7 +114,7 @@ module ApplicationHelper file.close wrap_element_html = doc.to_s html_to_render = "" - controller = "#{params[:target_controller].capitalize}Controller".classify.constantize.new + controller = "#{params[:target_controller].capitalize}_controller".classify.constantize.new data = controller.send("#{params[:target_action]}") el = wrap_element_html data.each do |key,value| diff --git a/app/helpers/orbit_helper.rb b/app/helpers/orbit_helper.rb index bb0a33d..1259a6c 100644 --- a/app/helpers/orbit_helper.rb +++ b/app/helpers/orbit_helper.rb @@ -3,7 +3,23 @@ module OrbitHelper @params = params end - def self.get_params + def self.set_page_categories(categories) + @categories = categories; + end + + def self.set_page_data_count(data_count) + @data_count = data_count + end + + def self.page_data_count + @data_count + end + + def self.page_categories + @categories + end + + def self.params @params end @@ -81,5 +97,4 @@ module OrbitHelper end res.html_safe end - end diff --git a/app/models/concerns/filter.rb b/app/models/concerns/filter.rb new file mode 100644 index 0000000..cf866ad --- /dev/null +++ b/app/models/concerns/filter.rb @@ -0,0 +1,10 @@ + module Filter + extend ActiveSupport::Concern + included do + end + def filter_by_categories(categories=[]) + categories = OrbitHelper.page_categories if categories.blank? + self.where(:category_id.in => categories) rescue [] + + end + end \ No newline at end of file diff --git a/app/models/page.rb b/app/models/page.rb index cf1e90d..267f220 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -7,26 +7,38 @@ class Page field :module field :url field :page_id - field :is_published, type: Boolean, default: true + field :data_count, type: Integer, default: 10 + field :enabled_for, type: Array, default: [] + field :menu_enabled_for, type: Array, default: [] + field :categories, type: Array, :default => [] has_many :page_parts, :autosave => true, :dependent => :destroy + has_many :child_page, :class_name => 'Page', :inverse_of => :parent_page, :dependent => :destroy belongs_to :parent_page, :class_name => 'Page', :inverse_of => :child_page def to_param - page_id.parameterize - end + page_id.parameterize + end - def self.find_by_param(input) - self.find_by(page_id: input) rescue nil - end + def self.find_by_param(input) + self.find_by(page_id: input) rescue nil + end - def self.root - self.where(:parent_page_id.ne => "" , :parent_page_id.exists => false).first - end + def self.root + self.where(:parent_page_id.ne => "" , :parent_page_id.exists => false).first + end - def root? - self.parent_page_id.nil? - end + def root? + self.parent_page_id.nil? + end + + def sorted_published_child_pages + self.child_page.where(:menu_enabled_for => I18n.locale).asc(:number) + end + + def published_child_pages + self.child_page.where(:menu_enabled_for => I18n.locale) + end end \ No newline at end of file diff --git a/app/views/admin/items/_node.html.erb b/app/views/admin/items/_node.html.erb index 0646a16..f929cd2 100644 --- a/app/views/admin/items/_node.html.erb +++ b/app/views/admin/items/_node.html.erb @@ -18,8 +18,7 @@ <% end %>
        <%= link_to content_tag(:i, nil, class: "icon-eye-open"), pages_edit_view_path(:id => node.id.to_s), class: "view-page open-slide tip", title: "View", data: {title: node.name} if node.class.to_s.eql?('Page') %> - <%# if node.class.to_s.downcase.eql?("page") %> - <%#= link_to content_tag(:i, nil, class: "icon-edit"), "#page", class: "open-slide tip page edit", title: t('editing.page'), data: {title: t('editing.page'), id: node.id.to_s, parent: node.parent_id.to_s, form: {name: node.name}.merge(node.title_translations)} %> + <%= link_to content_tag(:i, nil, class: "icon-edit"), edit_page_path(node.id), class: "open-slide tip page edit", title: "Edit Page", data: {title: "Edit Page"} if node.class.to_s.downcase.eql?("page") && !node.root? %> <%# elsif node.class.to_s.downcase.eql?("link") %> <%#= link_to content_tag(:i, nil, class: "icon-edit"), "#link", class: "open-slide tip link edit", title: t('editing.link'), data: {title: t('editing.link'), id: node.id.to_s, parent: node.parent_id.to_s, form: {name: node.name}.merge(node.title_translations).merge(node.urls)} %> <%# end %> @@ -29,12 +28,12 @@
        - <%# @site_in_use_locales.each do |valid_locale| %> - <%# if node.enabled_for && node.enabled_for.include?(valid_locale) %> - + <% I18n.available_locales.each do |valid_locale| %> + <% if node.enabled_for.include?(valid_locale.to_s) %> + <%= t(valid_locale.to_s) %> | - <%# end %> - <%# end %> + <% end %> + <% end %>
        diff --git a/app/views/admin/items/_node_and_children.html.erb b/app/views/admin/items/_node_and_children.html.erb index a121043..9dd87f7 100644 --- a/app/views/admin/items/_node_and_children.html.erb +++ b/app/views/admin/items/_node_and_children.html.erb @@ -1,12 +1,12 @@ <% unless node.root? %> -
      • +
      • <% end %> <%= render 'node', {node: node, level: level} rescue render 'admin/items/node', {node: node, level: level} %> <% unless node.child_page.blank? %> <% unless node.root? %>
          <% end %> - <% node.child_page.each do |child| %> + <% node.child_page.asc(:number).each do |child| %> <%= render 'node_and_children', {node: child, level: level + 1} rescue render 'admin/items/node_and_children', {node: child, level: level + 1} %> <% end %> <% unless node.root? %> diff --git a/app/views/admin/items/index.html.erb b/app/views/admin/items/index.html.erb index 05b12e6..bed5fe6 100644 --- a/app/views/admin/items/index.html.erb +++ b/app/views/admin/items/index.html.erb @@ -1,7 +1,6 @@ - <% node = Page.root %> <% unless node.nil? %> -
            +
              <%= render 'node_and_children', {node: node, level: 0} %>
            <% end %> @@ -9,4 +8,4 @@ <%#= render 'form_page' %> <%#= render 'form_link' %> <%= javascript_include_tag "lib/pageslide.js" %> - <%= javascript_include_tag "lib/items/items" %> +<%= javascript_include_tag "lib/items/items" %> diff --git a/app/views/pages/_form.html.erb b/app/views/pages/_form.html.erb new file mode 100644 index 0000000..c1941ad --- /dev/null +++ b/app/views/pages/_form.html.erb @@ -0,0 +1,73 @@ +
            + <% I18n.available_locales.each do |locale| %> + +
            + <%= f.fields_for :name_translations do |n| %> + <%= n.text_field locale, :value=>@page.name_translations[locale] rescue nil %> + <% end %> +
            + <% end %> +
            +
            + +
            + <%= f.text_field :page_id %> +
            + +
            + <%= f.select(:module, @modules.map{|m| [m.title,m.key]},{:include_blank => true},:class=>"module_select") %> + <%= f.hidden_field :parent_page, value: (params[:parent_page] || @page.parent_page_id) %> +
            +
            +
            + +
            + + <% if params[:action] == "edit" %> +
            + <% if !@categories.blank? %> + + <% end %> + <% @categories.each do |category| %> + + <% end %> +
            + <% end %> +
            +
            +
            + +
            + +
            +
            +
            +
            + + <% I18n.available_locales.each do |locale| %> + +
            + +
            + <% end %> +
            +
            + + + diff --git a/app/views/pages/edit.html.erb b/app/views/pages/edit.html.erb new file mode 100644 index 0000000..d65f9e2 --- /dev/null +++ b/app/views/pages/edit.html.erb @@ -0,0 +1,8 @@ +<%= form_for @page, url: {action: "update"},:class =>"form-horizontal", remote: true do |f| %> + <%= render "form", {:f=> f} %> +
            +
            + <%= f.submit "Update Page",:class=>"btn btn-primary" %> +
            +
            +<% end %> \ No newline at end of file diff --git a/app/views/pages/new.html.erb b/app/views/pages/new.html.erb index 1cdac05..91efbe7 100644 --- a/app/views/pages/new.html.erb +++ b/app/views/pages/new.html.erb @@ -1,16 +1,8 @@ -<%= form_for @page, url: {action: "create"}, remote: true do |f| %> - <% I18n.available_locales.each do |locale| %> - Page name <%= locale.to_s %>: - <%= f.fields_for :name_translations do |n| %> - <%= n.text_field locale %> - <% end %> - <% end %> - Page id: - <%= f.text_field :page_id %> - Module : - <%= f.select(:module, @modules.map{|m| [m.title,m.key]},{:include_blank => true}) %> - <%#= f.select(:parent_page, @pages.map{|page| [page.name, page.id]},{:include_blank => true}) %> - <%= f.hidden_field :parent_page, value: params[:parent_page] %> - <%#= f.text_field :number %> - <%= f.submit "Create Page" %> +<%= form_for @page, url: {action: "create"},:class =>"form-horizontal", remote: true do |f| %> + <%= render "form", {:f=> f} %> +
            +
            + <%= f.submit "Create Page", :class=>"btn btn-primary" %> +
            +
            <% end %> \ No newline at end of file diff --git a/app/views/pages/update.js b/app/views/pages/update.js new file mode 100644 index 0000000..13afaae --- /dev/null +++ b/app/views/pages/update.js @@ -0,0 +1,3 @@ +$("#main-wrap ol.sortable").html("<%= j render 'admin/items/node_and_children', {node: Page.root, level: 0} %>"); +$.pageslide.close(); +itemsLibrary.reBindHandlers(); \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index cf70dd3..633ad6d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -23,6 +23,8 @@ en: en: English zh_tw: Chinese _locale: English + en: English + zh_tw: Chinese more: "More" search: tags: Search Tags diff --git a/config/routes.rb b/config/routes.rb index 56fb2f1..2a1a220 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,6 +7,8 @@ Orbit::Application.routes.draw do get "/pages/edit_view" => "pages#edit_view" get "/pages/preview" => "pages#preview" + get "/pages/get_categories" => "pages#get_categories" + post "/pages/update_item_position" => "pages#update_item_position" get "/page_parts/getwidgets" => "page_parts#getwidgets" get "/page_parts/info" => "page_parts#info" diff --git a/lib/orbit_category/categorizable.rb b/lib/orbit_category/categorizable.rb index a3e1dff..ea0578a 100644 --- a/lib/orbit_category/categorizable.rb +++ b/lib/orbit_category/categorizable.rb @@ -1,7 +1,26 @@ module OrbitCategory module Categorizable def self.included(base) + base.extend ClassMethods base.field :category_id, type: BSON::ObjectId + base.class_eval "filter_by_categories" + end + + module ClassMethods + def filter_by_categories(categories=[]) + class_eval do + categories = OrbitHelper.page_categories if categories.blank? + if !categories.blank? + if categories.first == "all" + self.all.limit(OrbitHelper.page_data_count) + else + self.where(:category_id.in => categories).limit(OrbitHelper.page_data_count) rescue [] + end + else + [] + end + end + end end def category @@ -15,5 +34,6 @@ module OrbitCategory def disable? Category.find(self.category_id).disable? rescue nil end + end end \ No newline at end of file diff --git a/public/404.html b/public/404.html index a0daa0c..70bddd0 100644 --- a/public/404.html +++ b/public/404.html @@ -1,58 +1,28 @@ - - + + - The page you were looking for doesn't exist (404) - - - - - -
            -

            The page you were looking for doesn't exist.

            -

            You may have mistyped the address or the page may have moved.

            + +
            +
            +
            +
            +

            Page not found!!!

            +

            The page you were looking for doesn’t exist.

            +
            +
            -

            If you are the application owner check the logs for more information.

            + - + \ No newline at end of file diff --git a/public/stylesheets/error-pages.css b/public/stylesheets/error-pages.css new file mode 100644 index 0000000..9c8fb14 --- /dev/null +++ b/public/stylesheets/error-pages.css @@ -0,0 +1,41 @@ +@import url(http://fonts.googleapis.com/css?family=Roboto+Condensed); + +#error-page { + width: 820px; + margin: 160px auto 0 auto; +} +#error-page .card { + overflow: hidden; +} +#error-page .figure { + width: 460px; + height: 260px; + float: left; +} +#error-page .figure.code-403 { background: url(../img/403.png) center bottom no-repeat; } +#error-page .figure.code-404 { background: url(../img/404.png) center bottom no-repeat; } +#error-page .figure.code-500 { background: url(../img/500.png) center bottom no-repeat; } +#error-page .message { + float: right; + width: 330px; + margin: 60px 0 0 0; + padding: 16px 0; + border: solid 3px #D8D8D8; + border-left: 0; + border-right: 0; + text-align: center; +} +#error-page .message > * { + margin: 0; +} +#error-page .message h1 { + color: #333; + font-size: 52px; + font-family: 'Roboto Condensed', sans-serif; +} +#error-page .message p { + color: #999; + font-size: 15px; + font-family: sans-serif; + padding: 16px 0; +} \ No newline at end of file