From 50b97efc4664f3922393b3e53b1809865766805f Mon Sep 17 00:00:00 2001 From: Saurabh Bhatia Date: Thu, 12 Jun 2014 18:35:02 +0800 Subject: [PATCH] Member Plugin personal plugins --- .../javascripts/lib/bootstrap-typeahead.js | 335 ++++++++++++++++++ .../admin/personal_plugins_controller.rb | 17 + app/helpers/orbit_backend_helper.rb | 2 +- app/models/member_profile.rb | 1 - .../admin/members/_plugin_summary.html.erb | 46 +++ app/views/admin/members/show.html.erb | 8 + built_in_extensions.rb | 11 +- config/routes.rb | 3 +- lib/orbit_core_lib.rb | 26 ++ 9 files changed, 435 insertions(+), 14 deletions(-) create mode 100644 app/assets/javascripts/lib/bootstrap-typeahead.js create mode 100644 app/views/admin/members/_plugin_summary.html.erb diff --git a/app/assets/javascripts/lib/bootstrap-typeahead.js b/app/assets/javascripts/lib/bootstrap-typeahead.js new file mode 100644 index 0000000..c5c1597 --- /dev/null +++ b/app/assets/javascripts/lib/bootstrap-typeahead.js @@ -0,0 +1,335 @@ +/* ============================================================= + * bootstrap-typeahead.js v2.3.2 + * http://twbs.github.com/bootstrap/javascript.html#typeahead + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function($){ + + "use strict"; // jshint ;_; + + + /* TYPEAHEAD PUBLIC CLASS DEFINITION + * ================================= */ + + var Typeahead = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.typeahead.defaults, options) + this.matcher = this.options.matcher || this.matcher + this.sorter = this.options.sorter || this.sorter + this.highlighter = this.options.highlighter || this.highlighter + this.updater = this.options.updater || this.updater + this.source = this.options.source + this.$menu = $(this.options.menu) + this.shown = false + this.listen() + } + + Typeahead.prototype = { + + constructor: Typeahead + + , select: function () { + var val = this.$menu.find('.active').attr('data-value') + this.$element + .val(this.updater(val)) + .change() + return this.hide() + } + + , updater: function (item) { + return item + } + + , show: function () { + var pos = $.extend({}, this.$element.position(), { + height: this.$element[0].offsetHeight + }) + + this.$menu + .insertAfter(this.$element) + .css({ + top: pos.top + pos.height + , left: pos.left + }) + .show() + + this.shown = true + return this + } + + , hide: function () { + this.$menu.hide() + this.shown = false + return this + } + + , lookup: function (event) { + var items + + this.query = this.$element.val() + + if (!this.query || this.query.length < this.options.minLength) { + return this.shown ? this.hide() : this + } + + items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source + + return items ? this.process(items) : this + } + + , process: function (items) { + var that = this + + items = $.grep(items, function (item) { + return that.matcher(item) + }) + + items = this.sorter(items) + + if (!items.length) { + return this.shown ? this.hide() : this + } + + return this.render(items.slice(0, this.options.items)).show() + } + + , matcher: function (item) { + return ~item.toLowerCase().indexOf(this.query.toLowerCase()) + } + + , sorter: function (items) { + var beginswith = [] + , caseSensitive = [] + , caseInsensitive = [] + , item + + while (item = items.shift()) { + if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) + else if (~item.indexOf(this.query)) caseSensitive.push(item) + else caseInsensitive.push(item) + } + + return beginswith.concat(caseSensitive, caseInsensitive) + } + + , highlighter: function (item) { + var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') + return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { + return '' + match + '' + }) + } + + , render: function (items) { + var that = this + + items = $(items).map(function (i, item) { + i = $(that.options.item).attr('data-value', item) + i.find('a').html(that.highlighter(item)) + return i[0] + }) + + items.first().addClass('active') + this.$menu.html(items) + return this + } + + , next: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , next = active.next() + + if (!next.length) { + next = $(this.$menu.find('li')[0]) + } + + next.addClass('active') + } + + , prev: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , prev = active.prev() + + if (!prev.length) { + prev = this.$menu.find('li').last() + } + + prev.addClass('active') + } + + , listen: function () { + this.$element + .on('focus', $.proxy(this.focus, this)) + .on('blur', $.proxy(this.blur, this)) + .on('keypress', $.proxy(this.keypress, this)) + .on('keyup', $.proxy(this.keyup, this)) + + if (this.eventSupported('keydown')) { + this.$element.on('keydown', $.proxy(this.keydown, this)) + } + + this.$menu + .on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) + .on('mouseleave', 'li', $.proxy(this.mouseleave, this)) + } + + , eventSupported: function(eventName) { + var isSupported = eventName in this.$element + if (!isSupported) { + this.$element.setAttribute(eventName, 'return;') + isSupported = typeof this.$element[eventName] === 'function' + } + return isSupported + } + + , move: function (e) { + if (!this.shown) return + + switch(e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + e.preventDefault() + break + + case 38: // up arrow + e.preventDefault() + this.prev() + break + + case 40: // down arrow + e.preventDefault() + this.next() + break + } + + e.stopPropagation() + } + + , keydown: function (e) { + this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]) + this.move(e) + } + + , keypress: function (e) { + if (this.suppressKeyPressRepeat) return + this.move(e) + } + + , keyup: function (e) { + switch(e.keyCode) { + case 40: // down arrow + case 38: // up arrow + case 16: // shift + case 17: // ctrl + case 18: // alt + break + + case 9: // tab + case 13: // enter + if (!this.shown) return + this.select() + break + + case 27: // escape + if (!this.shown) return + this.hide() + break + + default: + this.lookup() + } + + e.stopPropagation() + e.preventDefault() + } + + , focus: function (e) { + this.focused = true + } + + , blur: function (e) { + this.focused = false + if (!this.mousedover && this.shown) this.hide() + } + + , click: function (e) { + e.stopPropagation() + e.preventDefault() + this.select() + this.$element.focus() + } + + , mouseenter: function (e) { + this.mousedover = true + this.$menu.find('.active').removeClass('active') + $(e.currentTarget).addClass('active') + } + + , mouseleave: function (e) { + this.mousedover = false + if (!this.focused && this.shown) this.hide() + } + + } + + + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ + + var old = $.fn.typeahead + + $.fn.typeahead = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('typeahead') + , options = typeof option == 'object' && option + if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.typeahead.defaults = { + source: [] + , items: 8 + , menu: '' + , item: '
  • ' + , minLength: 1 + } + + $.fn.typeahead.Constructor = Typeahead + + + /* TYPEAHEAD NO CONFLICT + * =================== */ + + $.fn.typeahead.noConflict = function () { + $.fn.typeahead = old + return this + } + + + /* TYPEAHEAD DATA-API + * ================== */ + + $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this) + if ($this.data('typeahead')) return + $this.typeahead($this.data()) + }) + +}(window.jQuery); diff --git a/app/controllers/admin/personal_plugins_controller.rb b/app/controllers/admin/personal_plugins_controller.rb index fc5f416..f4ed143 100644 --- a/app/controllers/admin/personal_plugins_controller.rb +++ b/app/controllers/admin/personal_plugins_controller.rb @@ -1,5 +1,22 @@ class Admin::PersonalPluginsController < OrbitMemberController def index @plugins = OrbitApp::Plugin::Registration.all rescue nil + + if(!params[:show_plugin_profile].nil?) + + @right_partial = OrbitApp::Plugin::Registration.find_by_app_name(params[:show_plugin_profile]).admin_partial_path + + if !@right_partial.blank? + respond_to do |format| + format.html { redirect_to( @right_partial ) } + end + else + @right_partial = "" + end + + else + @right_partial = "" + end + end end diff --git a/app/helpers/orbit_backend_helper.rb b/app/helpers/orbit_backend_helper.rb index 0063491..6620a6c 100644 --- a/app/helpers/orbit_backend_helper.rb +++ b/app/helpers/orbit_backend_helper.rb @@ -69,7 +69,7 @@ module OrbitBackendHelper end def add_attribute(partial, f, attribute) - new_object = f.object.send(attribute).build + new_object = f.object.send(attribute).build rescue nil fields = f.fields_for(attribute, new_object, :child_index => "new_#{attribute}") do |f| render :partial => partial, :object => new_object, :locals => {:f => f} end diff --git a/app/models/member_profile.rb b/app/models/member_profile.rb index f4739f3..da0a14b 100644 --- a/app/models/member_profile.rb +++ b/app/models/member_profile.rb @@ -91,5 +91,4 @@ class MemberProfile def email_present? self.email.present? end - end diff --git a/app/views/admin/members/_plugin_summary.html.erb b/app/views/admin/members/_plugin_summary.html.erb new file mode 100644 index 0000000..b952b7e --- /dev/null +++ b/app/views/admin/members/_plugin_summary.html.erb @@ -0,0 +1,46 @@ +
    +

    Module Name

    +
    + + + + + + + +
    <%= t(:module) %><%= t(:quantity) %>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + <% + @plugins.each do |plugin| + + if is_admin? + @data = plugin.app_name.classify.constantize.where(member_profile_id: @member.id).count + else + @data = plugin.app_name.classify.constantize.where(is_hidden: false , member_profile_id: @member.id).count + end + %> + + + + + <% end -%> + + +
    <%= plugin.name %><%= @data %>
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/views/admin/members/show.html.erb b/app/views/admin/members/show.html.erb index 7d5f9f6..4a3969b 100644 --- a/app/views/admin/members/show.html.erb +++ b/app/views/admin/members/show.html.erb @@ -59,6 +59,14 @@ +
    +
    +
    + <%=render :partial => @right_partial %> +
    +
    +
    + diff --git a/built_in_extensions.rb b/built_in_extensions.rb index ea9af72..0874e83 100644 --- a/built_in_extensions.rb +++ b/built_in_extensions.rb @@ -6,13 +6,4 @@ gem 'links', git: 'git@gitlab.tp.rulingcom.com:saurabh/links.git' gem 'page_content', git: 'git@gitlab.tp.rulingcom.com:saurabh/pagecontent.git' gem 'faq', git: 'git@gitlab.tp.rulingcom.com:saurabh/faq.git' #Personal Plugins -gem 'personal_journal', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-journal.git' -gem 'personal_lab', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-lab.git' -gem 'personal_conference', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-conference.git' -gem 'personal_experience', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-experience.git' -gem 'personal_diploma', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-diploma.git' -gem 'personal_honor', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-honor.git' -gem 'personal_patent', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-patent.git' -gem 'personal_project', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-project.git' -gem 'personal_research', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-research.git' -gem 'personal_book', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-book.git' \ No newline at end of file +gem 'personal_journal', git: 'git@gitlab.tp.rulingcom.com:saurabh/personal-journal.git' \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d3731a7..853a3f1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -82,8 +82,7 @@ Orbit::Application.routes.draw do end end - get "members/unapproved_members" => "members#unapproved_members" - + get "members/unapproved_members" => "members#unapproved_members" resources :members do collection do get 'edit_order_card' diff --git a/lib/orbit_core_lib.rb b/lib/orbit_core_lib.rb index 950e9c0..c655514 100644 --- a/lib/orbit_core_lib.rb +++ b/lib/orbit_core_lib.rb @@ -12,6 +12,32 @@ module OrbitCoreLib end end + module ObjectDisable + def self.included(base) + + base.instance_eval("field :disable,type: Boolean,:default => false") + base.instance_eval("scope :all, ->{ where(:disable.in => [false, nil, '']) }") + base.instance_eval("scope :admin_manager_all, ->{ find(:all) }") + + base.define_singleton_method :find do |*args| + if args ==[:all] + unscoped + else + res = unscoped.find(args) + res.count == 1 ? res[0] : res + end + end + + base.define_singleton_method :first do |*args| + all.first + end + + base.define_singleton_method :last do |*args| + all.last + end + + end + end # module ObjectAuthable # def self.included(base) # base.instance_eval("has_many :object_auths,as: :obj_authable,dependent: :delete")