From 7c398ce4fe529dc28ccc63cd26004f3be59f1e00 Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 18 Jul 2013 22:36:51 +0800 Subject: [PATCH] Changes for NTU General Affairs --- app/assets/images/menber-pic.png | Bin 3601 -> 2036 bytes app/assets/images/sign-in-logo.png | Bin 11789 -> 45584 bytes app/assets/javascripts/lib/checkbox.card.js | 23 + .../javascripts/lib/jquery.nanoscroller.js | 752 + app/assets/javascripts/member-selection.js | 25 + app/assets/javascripts/tinymce_orbit.js.erb | 4 +- app/assets/stylesheets/member_select.css | 230 + app/assets/stylesheets/style.css.erb | 4 +- .../admin/member_selects_controller.rb | 26 + app/controllers/saml_logins_controller.rb | 36 + app/controllers/sessions_controller.rb | 40 + app/helpers/application_helper.rb | 2 +- app/models/user/role.rb | 2 +- .../member_selects/_modal_select.html.erb | 86 + .../member_selects/_promoter_front.html.erb | 14 + .../member_selects/_selection_box.html.erb | 16 + app/views/admin/member_selects/_user.html.erb | 5 + .../member_selects/select_members.js.erb | 2 + .../update_selected_users.js.erb | 2 + app/views/devise/sessions/new.html.erb | 9 +- app/views/layouts/_orbit_bar.html.erb | 34 +- app/views/layouts/page_layout.html.erb | 13 + config/locales/en.yml | 1 + config/locales/ntu.en.yml | 13 + config/locales/ntu.zh_tw.yml | 13 + config/locales/zh_tw.yml | 1 + config/routes.rb | 12 + lib/ntu_archive/archive_ntu_dd.rb | 144 + lib/ntu_archive/xml/document_download.xml | 15441 +++++++++++++++ lib/ntu_archive/xml/frequently_ask.xml | 5595 ++++++ lib/ntu_archive/xml/hot_news.xml | 15451 ++++++++++++++++ lib/ntu_archive/xml/iso_zone.xml | 2575 +++ lib/ntu_archive/xml/meeting_record.xml | 1906 ++ lib/ntu_archive/xml/relative_law.xml | 2388 +++ lib/rss_ntu_0_to_11.rb | 35 + lib/rss_ntu_job.rb | 129 + lib/rss_ntu_migration.rb | 113 + lib/tasks/migrate.rake | 40 + public/tinymce/lists/template_list.js | 9 + public/tinymce/templates/layout1.htm | 15 + public/tinymce/templates/snippet1.htm | 1 + .../back_end/bulletins_controller.rb | 1 + .../announcement/app/models/bulletin.rb | 5 + .../back_end/bulletins/_form.html.erb | 13 +- .../front_end/bulletins/show.html.erb | 12 + .../assets/stylesheets/archive/archives.css | 24 + .../back_end/archive_files_controller.rb | 1 + .../front_end/archive_files_controller.rb | 6 + .../archive/app/models/archive_file.rb | 15 +- .../app/models/archive_file_multiple.rb | 2 +- .../back_end/archive_files/_form.html.erb | 15 +- .../archive_files/_form_file.html.erb | 25 +- .../front_end/archive_files/_index.html.erb | 39 +- .../front_end/archive_files/index.html.erb | 9 - .../front_end/archive_files/show.html.erb | 2 + .../archive/config/locales/en.yml | 1 + .../archive/config/locales/zh_tw.yml | 1 + .../built_in_modules/archive/config/routes.rb | 6 +- .../ask_acknowledgements_controller.rb | 2 + .../ask/back_end/ask_admins_controller.rb | 2 + .../ask/back_end/ask_categories_controller.rb | 2 + .../ask/back_end/ask_questions_controller.rb | 4 +- .../ask/back_end/ask_replies_controller.rb | 2 + .../ask_new/app/models/ask_category.rb | 3 +- vendor/built_in_modules/ask_new/init.rb | 10 +- .../panel/faq/back_end/qas_controller.rb | 1 + vendor/built_in_modules/faq/app/models/qa.rb | 5 + .../panel/faq/back_end/qas/_form.html.erb | 10 + .../panel/faq/front_end/qas/show.html.erb | 45 +- .../back_end/page_contexts_controller.rb | 1 + .../page_content/app/models/page_context.rb | 5 + .../back_end/page_contexts/_form.html.erb | 16 + .../front_end/page_contexts/index.html.erb | 1 + 73 files changed, 45400 insertions(+), 93 deletions(-) create mode 100644 app/assets/javascripts/lib/checkbox.card.js create mode 100644 app/assets/javascripts/lib/jquery.nanoscroller.js create mode 100644 app/assets/javascripts/member-selection.js create mode 100644 app/assets/stylesheets/member_select.css create mode 100644 app/controllers/saml_logins_controller.rb create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/views/admin/member_selects/_modal_select.html.erb create mode 100644 app/views/admin/member_selects/_promoter_front.html.erb create mode 100644 app/views/admin/member_selects/_selection_box.html.erb create mode 100644 app/views/admin/member_selects/_user.html.erb create mode 100644 app/views/admin/member_selects/select_members.js.erb create mode 100644 app/views/admin/member_selects/update_selected_users.js.erb create mode 100644 lib/ntu_archive/archive_ntu_dd.rb create mode 100644 lib/ntu_archive/xml/document_download.xml create mode 100644 lib/ntu_archive/xml/frequently_ask.xml create mode 100644 lib/ntu_archive/xml/hot_news.xml create mode 100644 lib/ntu_archive/xml/iso_zone.xml create mode 100644 lib/ntu_archive/xml/meeting_record.xml create mode 100644 lib/ntu_archive/xml/relative_law.xml create mode 100644 lib/rss_ntu_0_to_11.rb create mode 100644 lib/rss_ntu_job.rb create mode 100644 lib/rss_ntu_migration.rb create mode 100644 public/tinymce/lists/template_list.js create mode 100644 public/tinymce/templates/layout1.htm create mode 100644 public/tinymce/templates/snippet1.htm diff --git a/app/assets/images/menber-pic.png b/app/assets/images/menber-pic.png index 3e53af70da14a77a0c41c9a7739c896aca442d09..f0493974cc8e8e49e1048eef058ec50949e90a6c 100644 GIT binary patch delta 1464 zcmZ`(c~H^`6#j`QMW(VTc_NaUng@tis7)x?VoDyRt|+O1=z2g2c@I{aTAOB=ZfUup z=ABncR&JQ4g-5A1lbaT4mQ-G$!D#F(JG1*|Gw+yr^S=4!d+*IFHCfj&FA5|d+6gs+ z0syd+^fMt?l>`6vZ6H-tOJ!`9np>+`l=>B0V(n>Y3VR=}adpMmA)U||Cr7l( zTOc-1o z%FD~Es;ats_by9A>k^`bnUka3{_3NQbQxT2tfkpUWpzgogPbeJs@Z#OCp-1DG)=XK z=jH^jm%eQ&S9pf)mDjF8p-}pEEqtQzbwznO@;9G*?cLqoH*ezOL^K+W&*#S+rv?SZ zbcFj`g`}k1=4s_ZG&PaALH^T8J>%o#TO*Sa2@-DqM9L9tsqZrQIwclEH$O%1PN&ns zIZvY^BM(~AUX;N$VUTZYe8+RAVyn1Ac)LP*&PQ=wt>lHa$#=2d#Xq- zmlJjj0;OA-wj~>-?zsg&LhlGS&RWB|oB9TbuAUOE+<4!^v zy+5{G({k_LU25}xm&J>wr>6;`wY4=dD6V5_4pAa4%#8^fMXe4Ff?=!c>zoD%?Y*d- z!R?LY%szVYLXRR!OG~R=niwC~rii3c>BPhYM^u<>5|Q}yDIs2jyI#EP02_cn3{LUb zoa^u>@y@ml-Czctj)vHsN137pC!8g7bFl(K6qSlFHXboSKa)j8MMbp2XNAeh$-nDs z%ioPHEw#R0LKqoAHP4n(J})jdw6xGW?3DV0)Pw{ZaR+6g#-Me;(USC&IClKmGp2A& zQEydKHdb3}kpa+Ld@pG*)LSNa@qv@4lXCZz_~Lc_t@uf~H;)xQ2c;}oLdM17Us)`j zt&@`p_D#QxG&MC14Gpc9`=q8~KX1Jg;tm|p_87?Oqu#3@vpAcOm6g@k*9S9FiN(+8 zPiCfPXIH`YRI6okICpw_;Jv13&@DRP>FGK8hmEbIx3_m}EWj=?8p_i`2{*&fA=~an zI;_WdvOC|d>?Te`qtT^xLZPt#(Nu%Sp~lfs|K^uaugJU-n*p#k7^Gb=kRoIyC9$jb zU3eTE78Vv73V$QzJrOaPOqop9)zwvaWc^WKY;3G*SX?f*VHeUIIE(GCTg@qx*;bW} z$aLRJ*lZ7@b_*U!w-1ZOQYaLYW~a)rjg1Z6k7kJaK1g|$-a6CqT<*rFPv`j$Ik>2x zAlUn!3f8cvx)}mdTwE+z7il%Mx3|~TS=!q#8NQn5t*y)DUHq(~uNkV7QEgj?+uhc- zk~MX*#8CreCGwSSY$}yGWWzHvgIn1L$QV%gjl~C*0ctH@sYMmEL|6|{K5Y6hE)p2= z+0$qeoqG&{URJowgTfaw6wVTZI{0=6)tPku^ OePa@lOt|eGedZsp$c6|2 delta 3004 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 OoW%rfVOXc{9Q|(;j*hSZ diff --git a/app/assets/images/sign-in-logo.png b/app/assets/images/sign-in-logo.png index 53756c7c332f57f2375f755788d9d224b9fa2987..91020300ed5e84f759ca5f1d5bdfc6d73c5b93ea 100644 GIT binary patch delta 45355 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 KMNUMnLSTaZK2Xm9 delta 11257 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

!+RgX2yGTtjw&bHd?`OLoS`N$t6q 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 E0CR>yLjV8( diff --git a/app/assets/javascripts/lib/checkbox.card.js b/app/assets/javascripts/lib/checkbox.card.js new file mode 100644 index 000000000..78f2ff260 --- /dev/null +++ b/app/assets/javascripts/lib/checkbox.card.js @@ -0,0 +1,23 @@ +!function ($) { + $.fn.cardCheck = function(param) { + _defaultSettings = { + check: '', + }; + _set = $.extend(_defaultSettings, param); + $card = $(this); + $check = _set.check; + $check.each(function(){ + if($(this).attr('checked')) { + $(this).parent($card).addClass("active"); + } + }); + $card.on('click', function() { + $(this).toggleClass('active') + }); + } +}(window.jQuery); +$(function(){ + $('.checkbox-card > li').cardCheck({ + check: $('.checkbox-card > li input[type="checkbox"]'), + }); +}); \ No newline at end of file diff --git a/app/assets/javascripts/lib/jquery.nanoscroller.js b/app/assets/javascripts/lib/jquery.nanoscroller.js new file mode 100644 index 000000000..e7f53cc3f --- /dev/null +++ b/app/assets/javascripts/lib/jquery.nanoscroller.js @@ -0,0 +1,752 @@ +/*! nanoScrollerJS - v0.7.2 +* http://jamesflorentino.github.com/nanoScrollerJS/ +* Copyright (c) 2013 James Florentino; Licensed MIT */ + + +(function($, window, document) { + "use strict"; + + var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, defaults, getBrowserScrollbarWidth; + defaults = { + /** + a classname for the pane element. + @property paneClass + @type String + @default 'pane' + */ + + paneClass: 'pane', + /** + a classname for the slider element. + @property sliderClass + @type String + @default 'slider' + */ + + sliderClass: 'slider', + /** + a classname for the content element. + @property contentClass + @type String + @default 'content' + */ + + contentClass: 'content', + /** + a setting to enable native scrolling in iOS devices. + @property iOSNativeScrolling + @type Boolean + @default false + */ + + iOSNativeScrolling: false, + /** + a setting to prevent the rest of the page being + scrolled when user scrolls the `.content` element. + @property preventPageScrolling + @type Boolean + @default false + */ + + preventPageScrolling: false, + /** + a setting to disable binding to the resize event. + @property disableResize + @type Boolean + @default false + */ + + disableResize: false, + /** + a setting to make the scrollbar always visible. + @property alwaysVisible + @type Boolean + @default false + */ + + alwaysVisible: false, + /** + a default timeout for the `flash()` method. + @property flashDelay + @type Number + @default 1500 + */ + + flashDelay: 1500, + /** + a minimum height for the `.slider` element. + @property sliderMinHeight + @type Number + @default 20 + */ + + sliderMinHeight: 20, + /** + a maximum height for the `.slider` element. + @property sliderMaxHeight + @type Number + @default null + */ + + sliderMaxHeight: null + }; + /** + @property SCROLLBAR + @type String + @static + @final + @private + */ + + SCROLLBAR = 'scrollbar'; + /** + @property SCROLL + @type String + @static + @final + @private + */ + + SCROLL = 'scroll'; + /** + @property MOUSEDOWN + @type String + @final + @private + */ + + MOUSEDOWN = 'mousedown'; + /** + @property MOUSEMOVE + @type String + @static + @final + @private + */ + + MOUSEMOVE = 'mousemove'; + /** + @property MOUSEWHEEL + @type String + @final + @private + */ + + MOUSEWHEEL = 'mousewheel'; + /** + @property MOUSEUP + @type String + @static + @final + @private + */ + + MOUSEUP = 'mouseup'; + /** + @property RESIZE + @type String + @final + @private + */ + + RESIZE = 'resize'; + /** + @property DRAG + @type String + @static + @final + @private + */ + + DRAG = 'drag'; + /** + @property UP + @type String + @static + @final + @private + */ + + UP = 'up'; + /** + @property PANEDOWN + @type String + @static + @final + @private + */ + + PANEDOWN = 'panedown'; + /** + @property DOMSCROLL + @type String + @static + @final + @private + */ + + DOMSCROLL = 'DOMMouseScroll'; + /** + @property DOWN + @type String + @static + @final + @private + */ + + DOWN = 'down'; + /** + @property WHEEL + @type String + @static + @final + @private + */ + + WHEEL = 'wheel'; + /** + @property KEYDOWN + @type String + @static + @final + @private + */ + + KEYDOWN = 'keydown'; + /** + @property KEYUP + @type String + @static + @final + @private + */ + + KEYUP = 'keyup'; + /** + @property TOUCHMOVE + @type String + @static + @final + @private + */ + + TOUCHMOVE = 'touchmove'; + /** + @property BROWSER_IS_IE7 + @type Boolean + @static + @final + @private + */ + + BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject; + /** + @property BROWSER_SCROLLBAR_WIDTH + @type Number + @static + @default null + @private + */ + + BROWSER_SCROLLBAR_WIDTH = null; + /** + Returns browser's native scrollbar width + @method getBrowserScrollbarWidth + @return {Number} the scrollbar width in pixels + @static + @private + */ + + getBrowserScrollbarWidth = function() { + var outer, outerStyle, scrollbarWidth; + outer = document.createElement('div'); + outerStyle = outer.style; + outerStyle.position = 'absolute'; + outerStyle.width = '100px'; + outerStyle.height = '100px'; + outerStyle.overflow = SCROLL; + outerStyle.top = '-9999px'; + document.body.appendChild(outer); + scrollbarWidth = outer.offsetWidth - outer.clientWidth; + document.body.removeChild(outer); + return scrollbarWidth; + }; + /** + @class NanoScroll + @param element {HTMLElement|Node} the main element + @param options {Object} nanoScroller's options + @constructor + */ + + NanoScroll = (function() { + + function NanoScroll(el, options) { + this.el = el; + this.options = options; + BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth()); + this.$el = $(this.el); + this.doc = $(document); + this.win = $(window); + this.$content = this.$el.children("." + options.contentClass); + this.$content.attr('tabindex', 0); + this.content = this.$content[0]; + if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null)) { + this.nativeScrolling(); + } else { + this.generate(); + } + this.createEvents(); + this.addEvents(); + this.reset(); + } + + /** + Prevents the rest of the page being scrolled + when user scrolls the `.content` element. + @method preventScrolling + @param event {Event} + @param direction {String} Scroll direction (up or down) + @private + */ + + + NanoScroll.prototype.preventScrolling = function(e, direction) { + if (!this.isActive) { + return; + } + if (e.type === DOMSCROLL) { + if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) { + e.preventDefault(); + } + } else if (e.type === MOUSEWHEEL) { + if (!e.originalEvent || !e.originalEvent.wheelDelta) { + return; + } + if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) { + e.preventDefault(); + } + } + }; + + /** + Enable iOS native scrolling + */ + + + NanoScroll.prototype.nativeScrolling = function() { + this.$content.css({ + WebkitOverflowScrolling: 'touch' + }); + this.iOSNativeScrolling = true; + this.isActive = true; + }; + + /** + Updates those nanoScroller properties that + are related to current scrollbar position. + @method updateScrollValues + @private + */ + + + NanoScroll.prototype.updateScrollValues = function() { + var content; + content = this.content; + this.maxScrollTop = content.scrollHeight - content.clientHeight; + this.contentScrollTop = content.scrollTop; + if (!this.iOSNativeScrolling) { + this.maxSliderTop = this.paneHeight - this.sliderHeight; + this.sliderTop = this.contentScrollTop * this.maxSliderTop / this.maxScrollTop; + } + }; + + /** + Creates event related methods + @method createEvents + @private + */ + + + NanoScroll.prototype.createEvents = function() { + var _this = this; + this.events = { + down: function(e) { + _this.isBeingDragged = true; + _this.offsetY = e.pageY - _this.slider.offset().top; + _this.pane.addClass('active'); + _this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]); + return false; + }, + drag: function(e) { + _this.sliderY = e.pageY - _this.$el.offset().top - _this.offsetY; + _this.scroll(); + _this.updateScrollValues(); + if (_this.contentScrollTop >= _this.maxScrollTop) { + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollTop === 0) { + _this.$el.trigger('scrolltop'); + } + return false; + }, + up: function(e) { + _this.isBeingDragged = false; + _this.pane.removeClass('active'); + _this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]); + return false; + }, + resize: function(e) { + _this.reset(); + }, + panedown: function(e) { + _this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5); + _this.scroll(); + _this.events.down(e); + return false; + }, + scroll: function(e) { + if (_this.isBeingDragged) { + return; + } + _this.updateScrollValues(); + if (!_this.iOSNativeScrolling) { + _this.sliderY = _this.sliderTop; + _this.slider.css({ + top: _this.sliderTop + }); + } + if (e == null) { + return; + } + if (_this.contentScrollTop >= _this.maxScrollTop) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, DOWN); + } + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollTop === 0) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, UP); + } + _this.$el.trigger('scrolltop'); + } + }, + wheel: function(e) { + if (e == null) { + return; + } + _this.sliderY += -e.wheelDeltaY || -e.delta; + _this.scroll(); + return false; + } + }; + }; + + /** + Adds event listeners with jQuery. + @method addEvents + @private + */ + + + NanoScroll.prototype.addEvents = function() { + var events; + this.removeEvents(); + events = this.events; + if (!this.options.disableResize) { + this.win.bind(RESIZE, events[RESIZE]); + } + if (!this.iOSNativeScrolling) { + this.slider.bind(MOUSEDOWN, events[DOWN]); + this.pane.bind(MOUSEDOWN, events[PANEDOWN]).bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]); + } + this.$content.bind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]); + }; + + /** + Removes event listeners with jQuery. + @method removeEvents + @private + */ + + + NanoScroll.prototype.removeEvents = function() { + var events; + events = this.events; + this.win.unbind(RESIZE, events[RESIZE]); + if (!this.iOSNativeScrolling) { + this.slider.unbind(); + this.pane.unbind(); + } + this.$content.unbind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]); + }; + + /** + Generates nanoScroller's scrollbar and elements for it. + @method generate + @chainable + @private + */ + + + NanoScroll.prototype.generate = function() { + var contentClass, cssRule, options, paneClass, sliderClass; + options = this.options; + paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass; + if (!this.$el.find("" + paneClass).length && !this.$el.find("" + sliderClass).length) { + this.$el.append("

"); + } + this.pane = this.$el.children("." + paneClass); + this.slider = this.pane.find("." + sliderClass); + if (BROWSER_SCROLLBAR_WIDTH) { + cssRule = this.$el.css('direction') === 'rtl' ? { + left: -BROWSER_SCROLLBAR_WIDTH + } : { + right: -BROWSER_SCROLLBAR_WIDTH + }; + this.$el.addClass('has-scrollbar'); + } + if (cssRule != null) { + this.$content.css(cssRule); + } + return this; + }; + + /** + @method restore + @private + */ + + + NanoScroll.prototype.restore = function() { + this.stopped = false; + this.pane.show(); + this.addEvents(); + }; + + /** + Resets nanoScroller's scrollbar. + @method reset + @chainable + @example + $(".nano").nanoScroller(); + */ + + + NanoScroll.prototype.reset = function() { + var content, contentHeight, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, sliderHeight; + if (this.iOSNativeScrolling) { + this.contentHeight = this.content.scrollHeight; + return; + } + if (!this.$el.find("." + this.options.paneClass).length) { + this.generate().stop(); + } + if (this.stopped) { + this.restore(); + } + content = this.content; + contentStyle = content.style; + contentStyleOverflowY = contentStyle.overflowY; + if (BROWSER_IS_IE7) { + this.$content.css({ + height: this.$content.height() + }); + } + contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH; + paneHeight = this.pane.outerHeight(); + paneTop = parseInt(this.pane.css('top'), 10); + paneBottom = parseInt(this.pane.css('bottom'), 10); + paneOuterHeight = paneHeight + paneTop + paneBottom; + sliderHeight = Math.round(paneOuterHeight / contentHeight * paneOuterHeight); + if (sliderHeight < this.options.sliderMinHeight) { + sliderHeight = this.options.sliderMinHeight; + } else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) { + sliderHeight = this.options.sliderMaxHeight; + } + if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) { + sliderHeight += BROWSER_SCROLLBAR_WIDTH; + } + this.maxSliderTop = paneOuterHeight - sliderHeight; + this.contentHeight = contentHeight; + this.paneHeight = paneHeight; + this.paneOuterHeight = paneOuterHeight; + this.sliderHeight = sliderHeight; + this.slider.height(sliderHeight); + this.events.scroll(); + this.pane.show(); + this.isActive = true; + if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) { + this.pane.hide(); + this.isActive = false; + } else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) { + this.slider.hide(); + } else { + this.slider.show(); + } + this.pane.css({ + opacity: (this.options.alwaysVisible ? 1 : ''), + visibility: (this.options.alwaysVisible ? 'visible' : '') + }); + return this; + }; + + /** + @method scroll + @private + @example + $(".nano").nanoScroller({ scroll: 'top' }); + */ + + + NanoScroll.prototype.scroll = function() { + if (!this.isActive) { + return; + } + this.sliderY = Math.max(0, this.sliderY); + this.sliderY = Math.min(this.maxSliderTop, this.sliderY); + this.$content.scrollTop((this.paneHeight - this.contentHeight + BROWSER_SCROLLBAR_WIDTH) * this.sliderY / this.maxSliderTop * -1); + if (!this.iOSNativeScrolling) { + this.slider.css({ + top: this.sliderY + }); + } + return this; + }; + + /** + Scroll at the bottom with an offset value + @method scrollBottom + @param offsetY {Number} + @chainable + @example + $(".nano").nanoScroller({ scrollBottom: value }); + */ + + + NanoScroll.prototype.scrollBottom = function(offsetY) { + if (!this.isActive) { + return; + } + this.reset(); + this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL); + return this; + }; + + /** + Scroll at the top with an offset value + @method scrollTop + @param offsetY {Number} + @chainable + @example + $(".nano").nanoScroller({ scrollTop: value }); + */ + + + NanoScroll.prototype.scrollTop = function(offsetY) { + if (!this.isActive) { + return; + } + this.reset(); + this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL); + return this; + }; + + /** + Scroll to an element + @method scrollTo + @param node {Node} A node to scroll to. + @chainable + @example + $(".nano").nanoScroller({ scrollTo: $('#a_node') }); + */ + + + NanoScroll.prototype.scrollTo = function(node) { + if (!this.isActive) { + return; + } + this.reset(); + this.scrollTop($(node).get(0).offsetTop); + return this; + }; + + /** + To stop the operation. + This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI. + @method stop + @chainable + @example + $(".nano").nanoScroller({ stop: true }); + */ + + + NanoScroll.prototype.stop = function() { + this.stopped = true; + this.removeEvents(); + this.pane.hide(); + return this; + }; + + /** + To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s). + Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him. + @method flash + @chainable + @example + $(".nano").nanoScroller({ flash: true }); + */ + + + NanoScroll.prototype.flash = function() { + var _this = this; + if (!this.isActive) { + return; + } + this.reset(); + this.pane.addClass('flashed'); + setTimeout(function() { + _this.pane.removeClass('flashed'); + }, this.options.flashDelay); + return this; + }; + + return NanoScroll; + + })(); + $.fn.nanoScroller = function(settings) { + return this.each(function() { + var options, scrollbar; + if (!(scrollbar = this.nanoscroller)) { + options = $.extend({}, defaults, settings); + this.nanoscroller = scrollbar = new NanoScroll(this, options); + } + if (settings && typeof settings === "object") { + $.extend(scrollbar.options, settings); + if (settings.scrollBottom) { + return scrollbar.scrollBottom(settings.scrollBottom); + } + if (settings.scrollTop) { + return scrollbar.scrollTop(settings.scrollTop); + } + if (settings.scrollTo) { + return scrollbar.scrollTo(settings.scrollTo); + } + if (settings.scroll === 'bottom') { + return scrollbar.scrollBottom(0); + } + if (settings.scroll === 'top') { + return scrollbar.scrollTop(0); + } + if (settings.scroll && settings.scroll instanceof $) { + return scrollbar.scrollTo(settings.scroll); + } + if (settings.stop) { + return scrollbar.stop(); + } + if (settings.flash) { + return scrollbar.flash(); + } + } + return scrollbar.reset(); + }); + }; +})(jQuery, window, document); diff --git a/app/assets/javascripts/member-selection.js b/app/assets/javascripts/member-selection.js new file mode 100644 index 000000000..8ea7c34dd --- /dev/null +++ b/app/assets/javascripts/member-selection.js @@ -0,0 +1,25 @@ +$(document).ready(function() { + $(".select_user_modal").on('click', function(){ + var ids = []; + var users = $(this).siblings('#selected_users').children('span.selected_user'); + users.each(function(i) { + ids.push(users.eq(i).attr('user_id')); + }); + $("#main-wrap").after(""); + $.ajax({ + type: 'GET', + url: $(this).attr("rel"), + dataType: 'script', + data: {field: $(this).attr("field"), ids: ids}, + success: function (msg) { + $("#select_user_modal").modal('show'); }, + error: function(){ + alert("ERROR"); + } + }); + return false; + }); + $(document).on('click', ".remove_user", function(){ + $(this).parent().remove(); + }); +}); \ No newline at end of file diff --git a/app/assets/javascripts/tinymce_orbit.js.erb b/app/assets/javascripts/tinymce_orbit.js.erb index d73d77682..51d7ffe62 100644 --- a/app/assets/javascripts/tinymce_orbit.js.erb +++ b/app/assets/javascripts/tinymce_orbit.js.erb @@ -9,7 +9,7 @@ function load_tinymce() { // Theme options theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect", theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,fullscreen", + theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,fullscreen,|,template", theme_advanced_toolbar_location : "top", theme_advanced_toolbar_align : "left", theme_advanced_statusbar_location : "bottom", @@ -20,7 +20,7 @@ function load_tinymce() { skin_variant : "silver", font_size_style_values : "xx-small,x-small,small,medium,large,x-large,xx-large", // Drop lists for link/image/media/template dialogs - template_external_list_url : "js/template_list.js", + template_external_list_url : "/tinymce/lists/template_list.js", // external_link_list_url : "js/link_list.js", // external_image_list_url : "js/image_list.js", // media_external_list_url : "js/media_list.js" diff --git a/app/assets/stylesheets/member_select.css b/app/assets/stylesheets/member_select.css new file mode 100644 index 000000000..891a4f336 --- /dev/null +++ b/app/assets/stylesheets/member_select.css @@ -0,0 +1,230 @@ +/* Member Filter */ +#select_user #select_user_modal.modal { + width: 80%; + margin-left: -40%; +} +#select_user #select_user_modal .modal-body { + max-height: 425px; +} +#select_user #select_user_modal .modal-body form { + margin-bottom: 0px; +} +#select_user #select_user_modal .modal-body form fieldset { + min-height: 360px; +} +#select_user #select_user_modal .modal-body .radio.inline, +#select_user #select_user_modal .modal-body .checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; + min-width: 100px; + margin-left: 0; +} +#select_user #select_user_modal .modal-body .form-actions { + margin: 20px 0 0; + padding: 10px 0 0; + background-color: transparent; + text-align: right; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano { + width: 160px; + min-height: 425px; + float: left; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano .pane { + right: 6px; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs { + width: 140px; + float: left; + margin-bottom: 0; + margin-right: 0; + border-right: 1px solid #ddd; + border-bottom: none; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li { + float: none; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs .active > a, +#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +#select_user #select_user_modal .member-filter-options { + float: left; + display: inline-block; + width: 175px; + min-height: 425px; + margin-right: 10px; + padding: 0 10px 0 0; +} +#select_user #select_user_modal .member-filter-options select { + width: 165px; +} +#select_user #select_user_modal .member-filter-options .btn { + display: block; +} +#select_user #select_user_modal .member-filter-result { + padding-left: 15px; + min-height: 360px; + width: auto; +} + + +/* Check Box Card */ +.checkbox-card { + margin: 0; +} +.checkbox-card li { + position: relative; + list-style: none; + color: #FFFFFF; + width: 180px; + height: 40px; + margin: 0 10px 10px 0; + float: left; + display: inline-block; + background-color: #cccccc; + overflow: hidden; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; +} +.checkbox-card li.mark { + width: 0; + height: 0; + padding: 0; + margin: 0; + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + visibility: hidden; +} +.checkbox-card li:hover { + background-color: #0088cc; +} +.checkbox-card li:after { + content: ""; + display: block; + clear: both; + height: 0; + visibility: hidden; +} +.checkbox-card li.active:before { + -webkit-text-size-adjust : none; + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + color: #FFF; + text-decoration: inherit; + content: "\f00c"; + position: absolute; + right: 0px; + top: 0px; + line-height: 14px; + text-indent: 10px; + font-size: 10px; + width: 0px; + height: 0px; + border-style: solid; + border-width: 0 22px 22px 0; + border-color: transparent #51a351 transparent transparent; +} +.checkbox-card li.active label { +} +.checkbox-card li label { + margin-bottom: 0px; + overflow: hidden; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.checkbox-card li input { + opacity: 0; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + margin: 0; + z-index: 10; +} +.checkbox-card li label span { + -webkit-text-size-adjust : none; + font-size: 10px; + display: block; + width: 130px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #666666; + margin-top: -3px; +} +.checkbox-card li:hover label span, +.checkbox-card li:hover label span.user-name { + color: #FFFFFF; +} +.checkbox-card li label span.user-name { + font-size: 12px; + color: #363636; + padding: 2px 0 0; + margin-top: 0; +} +.checkbox-card li .user-pic { + float: left; + margin-right: 5px; + width: 40px; + height: 40px; +} +#selected_users .selected_user { + display: block; + margin-bottom: 5px; +} +#selected_users .selected_user .remove_user { + font-size: 15px; +} +/* +.promoter { + border-color: #CCCCCC; + border-style: solid; + border-width: 0 1px; + padding: 0 10px 5px 10px; +} +.promoter > div { + border-bottom: 1px solid #CCCCCC; +} +.promoter > div:after { + content: ""; + clear: both; + display: block; + visibility: hidden; +} +.promoter > div > span { + display: block; + margin-left: 70px; + padding-bottom: 5px; +} +.promoter p { + width: 70px; + float: left; + text-align:right; +}*/ \ No newline at end of file diff --git a/app/assets/stylesheets/style.css.erb b/app/assets/stylesheets/style.css.erb index d28c86e1c..f238f3497 100644 --- a/app/assets/stylesheets/style.css.erb +++ b/app/assets/stylesheets/style.css.erb @@ -1,5 +1,7 @@ /*style*/ - +* { + outline: none; +} @font-face{ font-family: 'WebSymbolsRegular'; src: url(<%= asset_path 'websymbols-regular-webfont.eot' %>); diff --git a/app/controllers/admin/member_selects_controller.rb b/app/controllers/admin/member_selects_controller.rb index 9d7e6643d..40bb6dd90 100644 --- a/app/controllers/admin/member_selects_controller.rb +++ b/app/controllers/admin/member_selects_controller.rb @@ -70,4 +70,30 @@ class Admin::MemberSelectsController < OrbitBackendController end + def select_members + selected_users = User.find(params[:ids]) rescue [] + @field = params[:field] + roles = Role.all + @sorted_users = roles.inject({}) do |users, role| + users[role] = role.users.where(:email.not => /guest|rulingcom/) - selected_users + users + end + end + + def set_roles + roles = Role.find(params[:role_ids]) rescue [] + @field = params[:field] + @users = roles.inject([]) do |users, role| + users += role.users.where(:email.not => /guest|rulingcom/).entries + users + end + render 'admin/member_selects/update_selected_users' + end + + def set_users + @users = User.find(params[:user_ids]) rescue [] + @field = params[:field] + render 'admin/member_selects/update_selected_users' + end + end diff --git a/app/controllers/saml_logins_controller.rb b/app/controllers/saml_logins_controller.rb new file mode 100644 index 000000000..23ecd8191 --- /dev/null +++ b/app/controllers/saml_logins_controller.rb @@ -0,0 +1,36 @@ +class SamlLoginsController < ApplicationController + + require "net/http" + require "uri" + require 'rexml/document' + include REXML + + def index + + if params[:wa] == "wsignoutcleanup1.0" #logout + + redirect_to :root + + else #login + + + @wresult = params[:wresult] + @wctx = params[:wctx] + + @main_url = LIST[:sites][@wctx]['url'] + @main_public_key = LIST[:sites][@wctx]['key'] + + @doc = REXML::Document.new @wresult + + @main_public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzKawlFWAMzA/uV/kcewd\nmtj8PcqxosmnSh7ZzJ0DumG2ieeP9oDBicqbqIEaeJVvrRzYJD2a+u8x5KKMKB8J\nHbMUpCBFlIpkDMjU/oZVMcYT9pcH51QWNvCgHG7prVykSGFz1JRvjSP6cwuZKBFd\nFFneOViETqoMIO1DbRLXsGfPvMOJY9C1xDwv1dLv0Wbj7M9N6eNz06a50bu3I4gl\nMumxWnZUabXL3G62S/Si4NM7J2jOUnkEOxJWOhcAX/iiqS9T8AHu84um2+mLQpfB\nJJFFIWCIAtU78VnIN5JSWwjFU5TsiSyCFYpGXKxUFD25cFmt3SfG0gwmrFis5Pdn\nhwIDAQAB\n-----END PUBLIC KEY-----\n" + + public_key = OpenSSL::PKey::RSA.new(@main_public_key) + encrypted_data = public_key.public_encrypt(@doc.elements["//saml:AttributeValue"].text) + + redirect_to "http://#{@main_url}/user_login?" + { :wresult => encrypted_data }.to_param + + end + + end + +end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 000000000..927719bc2 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,40 @@ +# encoding: utf-8 + +class SessionsController < Devise::SessionsController + prepend_before_filter :require_no_authentication, :only => [ :new, :create ] + + + def create + @site = Site.first + + private_key = OpenSSL::PKey::RSA.new(@site.private_key) + wresult = private_key.private_decrypt(request.params['wresult']) + + @ids = wresult.split("@") + + login_uid = @ids[0] + + resource = User.first(conditions:{user_id: login_uid}) + + if !resource.blank? + resource_name = resource.class.to_s.downcase + sign_in(resource_name, resource) + session[:user_id_type] = "myntu" + redirect_to after_sign_in_path_for(resource) + else + flash[:error] = "很抱歉,您無此權限或帳號登入本站,請洽本站管理員
Sorry, you don't have the account or authority to login. Please contact the website administrator." + redirect_to :root + end + end + + def destroy + @user_id_type = session[:user_id_type] + sign_out + if @user_id_type == "myntu" + redirect_to "https://adfs.ntu.edu.tw/adfs/ls/?wa=wsignout1.0&wreply=https://galogin.ntu.edu.tw" + else + redirect_to root_path + end + end + +end \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4f52935fa..0d2d48d7c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -303,7 +303,7 @@ module ApplicationHelper # NTU link def get_link(site_number) - "http://#{request.host}:2#{site_number}00" + "http://#{site_number}.#{request.domain(3)}" end def sortable(column, title = nil, options = {}) diff --git a/app/models/user/role.rb b/app/models/user/role.rb index e1e50d9aa..74b2839b3 100644 --- a/app/models/user/role.rb +++ b/app/models/user/role.rb @@ -10,7 +10,7 @@ class Role < Attribute field :title, localize: true has_many :sub_roles, :autosave => true, :dependent => :destroy - has_many :users + has_and_belongs_to_many :users # has_many :statuses, :autosave => true, :dependent => :destroy # has_many :attribute_fields, :autosave => true, :dependent => :destroy has_many :role_statuses, :autosave => true, :dependent => :destroy diff --git a/app/views/admin/member_selects/_modal_select.html.erb b/app/views/admin/member_selects/_modal_select.html.erb new file mode 100644 index 000000000..4616f0b1e --- /dev/null +++ b/app/views/admin/member_selects/_modal_select.html.erb @@ -0,0 +1,86 @@ + + + + \ No newline at end of file diff --git a/app/views/admin/member_selects/_promoter_front.html.erb b/app/views/admin/member_selects/_promoter_front.html.erb new file mode 100644 index 000000000..f8bec0fb6 --- /dev/null +++ b/app/views/admin/member_selects/_promoter_front.html.erb @@ -0,0 +1,14 @@ +<% unless users.blank? %> +
+

<%= t(:promoter) %>:

+
    + <% users.each do |user| %> +
  • +

    + <%= link_to user.name, "mailto:#{user.email}", class: "promoter-name" %> / <%= user.office_tel %> +

    +
  • + <% end %> +
+
+<% end %> \ No newline at end of file diff --git a/app/views/admin/member_selects/_selection_box.html.erb b/app/views/admin/member_selects/_selection_box.html.erb new file mode 100644 index 000000000..c54929aa7 --- /dev/null +++ b/app/views/admin/member_selects/_selection_box.html.erb @@ -0,0 +1,16 @@ +<% content_for :page_specific_javascript do -%> + <%= javascript_include_tag "member-selection" %> + <%= javascript_include_tag "lib/jquery.nanoscroller" %> + <%= javascript_include_tag "lib/checkbox.card" %> +<% end -%> +<% content_for :page_specific_css do -%> + <%= stylesheet_link_tag "member_select" %> +<% end %> + +
+
+ <%= render partial: 'admin/member_selects/user', collection: users, locals: {field: field} %> + <%= hidden_field_tag field %> +
+ <%= link_to t(:add), '#', class: 'btn btn-primary btn-small select_user_modal', rel: select_members_admin_member_selects_path, field: field %> +
\ No newline at end of file diff --git a/app/views/admin/member_selects/_user.html.erb b/app/views/admin/member_selects/_user.html.erb new file mode 100644 index 000000000..827c5c75b --- /dev/null +++ b/app/views/admin/member_selects/_user.html.erb @@ -0,0 +1,5 @@ + + <%= user.name %> + <%= hidden_field_tag field, user.id %> + <%= content_tag :span, '×', class: 'close remove_user' %> + \ No newline at end of file diff --git a/app/views/admin/member_selects/select_members.js.erb b/app/views/admin/member_selects/select_members.js.erb new file mode 100644 index 000000000..62d7607d7 --- /dev/null +++ b/app/views/admin/member_selects/select_members.js.erb @@ -0,0 +1,2 @@ +$("#select_user").html("<%= j render partial: 'admin/member_selects/modal_select', locals: {field: 'bulletin[user_ids][]'} %>"); +$("#select_user_modal").modal(); \ No newline at end of file diff --git a/app/views/admin/member_selects/update_selected_users.js.erb b/app/views/admin/member_selects/update_selected_users.js.erb new file mode 100644 index 000000000..d69be303e --- /dev/null +++ b/app/views/admin/member_selects/update_selected_users.js.erb @@ -0,0 +1,2 @@ +$("#selected_users").append("<%= j render partial: 'user', collection: @users, locals: {field: @field} %>"); +$("#select_user_modal").modal('hide'); \ No newline at end of file diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb index 71bd12f46..8a4b8b3eb 100644 --- a/app/views/devise/sessions/new.html.erb +++ b/app/views/devise/sessions/new.html.erb @@ -9,15 +9,20 @@ <%= content_tag :span, msg, :class => [key, "notice label label-warning"] %> <% end %>

You need to sign in or sign up before continuing.

+ <% @request_hosts = request.host_with_port.split(".") %> + 使用計中帳號登入 +

+ 或使用本站帳號登入 +

<%= f.label :user_id ,t("users.user_id")%> - <%= f.text_field :user_id, :placeholder => t("users.user_id"), :style => "width: 330px;" %> + <%= f.text_field :user_id, :placeholder => t("users.user_id"), :style => "width: 326px;" %> Please correct the error
<%= f.label :password,t("password") %> - <%= f.password_field :password, :placeholder => t(:dots), :style => "width: 330px;" %> + <%= f.password_field :password, :placeholder => t(:dots), :style => "width: 326px;" %> Please correct the error <%= link_to t(:forgot_password), new_user_password_path, :class => 'pull-right forgot hide' %>
diff --git a/app/views/layouts/_orbit_bar.html.erb b/app/views/layouts/_orbit_bar.html.erb index 52deb8e7e..ef1a87bcd 100644 --- a/app/views/layouts/_orbit_bar.html.erb +++ b/app/views/layouts/_orbit_bar.html.erb @@ -10,19 +10,10 @@
+ +
+
+ +
+

<%= t(:promoter) %>

+
+ <%= render partial: 'admin/member_selects/selection_box', locals: {field: 'archive_file[user_ids][]', users: @users} %> +
+
+ @@ -86,12 +96,13 @@ File File Name <%= t('呈現語系')%> + <%= t('archive.download_count')%> - +
<%= hidden_field_tag 'archive_file_multiple_field_count', @archive_file.archive_file_multiples.count %> ADD/新增 diff --git a/vendor/built_in_modules/archive/app/views/panel/archive/back_end/archive_files/_form_file.html.erb b/vendor/built_in_modules/archive/app/views/panel/archive/back_end/archive_files/_form_file.html.erb index 52f776668..ec3e601fa 100644 --- a/vendor/built_in_modules/archive/app/views/panel/archive/back_end/archive_files/_form_file.html.erb +++ b/vendor/built_in_modules/archive/app/views/panel/archive/back_end/archive_files/_form_file.html.erb @@ -4,7 +4,7 @@
- <%= f.text_field :sort_number %> + <%= f.text_field :sort_number, class: 'input-mini' %>
@@ -47,18 +47,19 @@ <% end %> <%= hidden_field_tag 'archive_file[archive_file_multiples_attributes][0][choose_lang][]', '' %> - - - <% if form_file.new_record? %> - - <% else %> - <%= f.hidden_field :id %> - - <%= f.hidden_field :should_destroy, :value => nil, :class => 'should_destroy' %> - <% end %> - - + <%= form_file.download_count %> + + + + <% if form_file.new_record? %> + + <% else %> + <%= f.hidden_field :id %> + + <%= f.hidden_field :should_destroy, :value => nil, :class => 'should_destroy' %> + <% end %> + diff --git a/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/_index.html.erb b/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/_index.html.erb index b5aded496..58f61629c 100644 --- a/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/_index.html.erb +++ b/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/_index.html.erb @@ -8,7 +8,7 @@ <%= sortable(:title, t("archive.Title"))%> <%= t("archive.Files")%> - <%= sortable(:archive_file_category, t("archive.Category"))%> + <%= t(:promoter)%> @@ -23,7 +23,7 @@ <% post.archive_file_multiples.asc(:_id).each do | afile | %> <% if afile.file.file and afile.choose_lang_display(I18n.locale.to_s) %>
  • - <%= link_to afile.file_title, afile.file.url, {:target => '_blank', :title => afile.file_title, :class => "o-archives-file"} %> + <%= link_to afile.file_title, afile.file.url, {:target => '_blank', :title => afile.file_title, :class => "o-archives-file download_count", rel: download_panel_archive_front_end_archive_file_path(afile, inner: true)} %> <%= post.get_file_icon(afile.file.url) %>
  • <% end %> @@ -32,9 +32,21 @@ <% end %>
    -
    - <%= post.archive_file_category.title %> -
    + + <% unless post.get_users.blank? %> +
    +
      + <% post.get_users.each do |user| %> +
    • +

      + <%= link_to user.name, "mailto:#{user.email}", class: "promoter-name" %> / <%= user.office_tel %> +

      +
    • + <% end %> +
    +
    + <% end %> + <% end %> @@ -44,13 +56,10 @@ <%= paginate @archive_files, :param_name => :page_main, :params => {:inner => 'false'} %> -<%= stylesheet_link_tag "archive/archives" %> - - - - - - - - - + diff --git a/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/index.html.erb b/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/index.html.erb index 14377a7c7..383453b5a 100644 --- a/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/index.html.erb +++ b/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/index.html.erb @@ -7,12 +7,3 @@ <%= stylesheet_link_tag "archive/archives" %> - - - - - - - - - diff --git a/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/show.html.erb b/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/show.html.erb index fe6994dac..7ecfcfdb2 100644 --- a/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/show.html.erb +++ b/vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/show.html.erb @@ -27,4 +27,6 @@ +<%= render partial: 'admin/member_selects/promoter_front', locals: {users: @archive_file.get_users} %> + <%= stylesheet_link_tag "archive/archives" %> \ No newline at end of file diff --git a/vendor/built_in_modules/archive/config/locales/en.yml b/vendor/built_in_modules/archive/config/locales/en.yml index d108c4edd..f80b4e632 100644 --- a/vendor/built_in_modules/archive/config/locales/en.yml +++ b/vendor/built_in_modules/archive/config/locales/en.yml @@ -2,6 +2,7 @@ en: archive: archive: Archive + download_count: Download count Title: Title Files: Files Category: Category diff --git a/vendor/built_in_modules/archive/config/locales/zh_tw.yml b/vendor/built_in_modules/archive/config/locales/zh_tw.yml index eeb190b55..442ea6a69 100644 --- a/vendor/built_in_modules/archive/config/locales/zh_tw.yml +++ b/vendor/built_in_modules/archive/config/locales/zh_tw.yml @@ -2,6 +2,7 @@ zh_tw: archive: archive: 檔案室 + download_count: 下載次數 Title: 標題 Files: 檔案 Category: 類別 diff --git a/vendor/built_in_modules/archive/config/routes.rb b/vendor/built_in_modules/archive/config/routes.rb index b620dbee8..5abfba275 100644 --- a/vendor/built_in_modules/archive/config/routes.rb +++ b/vendor/built_in_modules/archive/config/routes.rb @@ -12,7 +12,11 @@ Rails.application.routes.draw do end namespace :front_end do match "archive_files" => "archive_files#index" - resources :archive_files + resources :archive_files do + member do + get 'download' + end + end end namespace :widget do match "index" => "archive_files#index" diff --git a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_acknowledgements_controller.rb b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_acknowledgements_controller.rb index c894bb429..58f2ef476 100644 --- a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_acknowledgements_controller.rb +++ b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_acknowledgements_controller.rb @@ -2,6 +2,8 @@ class Panel::Ask::BackEnd::AskAcknowledgementsController < OrbitBackendControlle include AdminHelper include OrbitControllerLib::DivisionForDisable + before_filter :for_app_manager + def initialize super @app_title = 'ask_acknowledgement' diff --git a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_admins_controller.rb b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_admins_controller.rb index 5b79779df..b6994da0b 100644 --- a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_admins_controller.rb +++ b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_admins_controller.rb @@ -3,6 +3,8 @@ class Panel::Ask::BackEnd::AskAdminsController < OrbitBackendController include AdminHelper include OrbitControllerLib::DivisionForDisable + before_filter :for_app_manager + def initialize super @app_title = 'ask_admins' diff --git a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_categories_controller.rb b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_categories_controller.rb index def62b0cf..2ee4b6a91 100644 --- a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_categories_controller.rb +++ b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_categories_controller.rb @@ -3,6 +3,8 @@ class Panel::Ask::BackEnd::AskCategoriesController < OrbitBackendController include AdminHelper include OrbitControllerLib::DivisionForDisable + before_filter :for_app_manager + def initialize super @app_title = 'ask_categories' diff --git a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_questions_controller.rb b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_questions_controller.rb index 9d31ab732..560da4e78 100644 --- a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_questions_controller.rb +++ b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_questions_controller.rb @@ -5,9 +5,11 @@ class Panel::Ask::BackEnd::AskQuestionsController < OrbitBackendController include AdminHelper include OrbitControllerLib::DivisionForDisable + before_filter :for_app_manager + def initialize super - @app_title = 'ask_questions' + @app_title = 'ask' end def index diff --git a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_replies_controller.rb b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_replies_controller.rb index 6427af00c..86219b7ad 100644 --- a/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_replies_controller.rb +++ b/vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_replies_controller.rb @@ -3,6 +3,8 @@ class Panel::Ask::BackEnd::AskRepliesController < OrbitBackendController include AdminHelper include OrbitControllerLib::DivisionForDisable + before_filter :for_app_manager + def initialize super @app_title = 'ask_replies' diff --git a/vendor/built_in_modules/ask_new/app/models/ask_category.rb b/vendor/built_in_modules/ask_new/app/models/ask_category.rb index 079afbf5c..d90a8856c 100644 --- a/vendor/built_in_modules/ask_new/app/models/ask_category.rb +++ b/vendor/built_in_modules/ask_new/app/models/ask_category.rb @@ -2,7 +2,8 @@ class AskCategory include Mongoid::Document include Mongoid::Timestamps include OrbitCoreLib::ObjectDisable - + include OrbitCoreLib::ObjectAuthable + field :name, localize: true field :key diff --git a/vendor/built_in_modules/ask_new/init.rb b/vendor/built_in_modules/ask_new/init.rb index 0b20d5581..68ed26dab 100644 --- a/vendor/built_in_modules/ask_new/init.rb +++ b/vendor/built_in_modules/ask_new/init.rb @@ -23,26 +23,26 @@ module Ask side_bar do head_label_i18n 'ask.ask', icon_class: 'icons-light-bulb' - available_for [:admin,:manager,:sub_manager] + available_for [:admin] active_for_controllers({ private: ['ask_questions'] }) head_link_path "panel_ask_back_end_ask_questions_path" context_link 'categories', link_path: 'panel_ask_back_end_ask_categories_path', priority: 1, active_for_action: {:ask_categories=>:index}, - available_for: [:all] + available_for: [:manager] context_link 'ask.acknowledgement', link_path: 'panel_ask_back_end_ask_acknowledgements_path', priority: 1, - available_for: [:all] + available_for: [:manager] context_link 'ask.admin', link_path: 'panel_ask_back_end_ask_admins_path', priority: 1, - available_for: [:all] + available_for: [:manager] context_link 'ask.export', link_path: 'export_panel_ask_back_end_ask_questions_path', priority: 1, - available_for: [:all] + available_for: [:manager] end end diff --git a/vendor/built_in_modules/faq/app/controllers/panel/faq/back_end/qas_controller.rb b/vendor/built_in_modules/faq/app/controllers/panel/faq/back_end/qas_controller.rb index 8cf359a66..d46583e3c 100644 --- a/vendor/built_in_modules/faq/app/controllers/panel/faq/back_end/qas_controller.rb +++ b/vendor/built_in_modules/faq/app/controllers/panel/faq/back_end/qas_controller.rb @@ -71,6 +71,7 @@ class Panel::Faq::BackEnd::QasController < OrbitBackendController # GET /qas/1/edit def edit @qa = Qa.find(params[:id]) + @users = @qa.get_users @tags = get_tags end diff --git a/vendor/built_in_modules/faq/app/models/qa.rb b/vendor/built_in_modules/faq/app/models/qa.rb index 5a27d2417..516679727 100644 --- a/vendor/built_in_modules/faq/app/models/qa.rb +++ b/vendor/built_in_modules/faq/app/models/qa.rb @@ -17,6 +17,7 @@ class Qa field :create_user_id field :update_user_id + field :user_ids field :is_top, :type => Boolean, :default => false field :is_hot, :type => Boolean, :default => false @@ -72,6 +73,10 @@ class Qa end end + def get_users + User.find(self.user_ids) rescue [] + end + protected def qa_category_with_title diff --git a/vendor/built_in_modules/faq/app/views/panel/faq/back_end/qas/_form.html.erb b/vendor/built_in_modules/faq/app/views/panel/faq/back_end/qas/_form.html.erb index 18b49cc2f..e89ff60fc 100644 --- a/vendor/built_in_modules/faq/app/views/panel/faq/back_end/qas/_form.html.erb +++ b/vendor/built_in_modules/faq/app/views/panel/faq/back_end/qas/_form.html.erb @@ -45,6 +45,16 @@ <% end %> + +
    +
    + +
    +

    <%= t(:promoter) %>

    +
    + <%= render partial: 'admin/member_selects/selection_box', locals: {field: 'qa[user_ids][]', users: @users} %> +
    +
    diff --git a/vendor/built_in_modules/faq/app/views/panel/faq/front_end/qas/show.html.erb b/vendor/built_in_modules/faq/app/views/panel/faq/front_end/qas/show.html.erb index 970edbd53..2a736511b 100644 --- a/vendor/built_in_modules/faq/app/views/panel/faq/front_end/qas/show.html.erb +++ b/vendor/built_in_modules/faq/app/views/panel/faq/front_end/qas/show.html.erb @@ -8,25 +8,30 @@
    <%= @qa.answer.html_safe rescue '' %>
    -
    - <% if @qa.qa_links.size > 0 %> -
    - - -
    - <% end %> - <% if @qa.qa_files.size > 0 %> -
    - -
    - <% @qa.qa_files.each do | bfile | %> - <%= link_to bfile.title, bfile.file.url, {:target => '_blank', :title => bfile.description} if bfile.file.file %> + +<% if @qa.qa_links.size > 0 || @qa.qa_files.size > 0 %> +
    + <% if @qa.qa_links.size > 0 %> +
    + +
    -
    - <% end %> -
    + <% end %> + <% if @qa.qa_files.size > 0 %> +
    + +
    + <% @qa.qa_files.each do | bfile | %> + <%= link_to bfile.title, bfile.file.url, {:target => '_blank', :title => bfile.description} if bfile.file.file %> + <% end %> +
    +
    + <% end %> +
    +<% end %> + +<%= render partial: 'admin/member_selects/promoter_front', locals: {users: @qa.get_users} %> \ No newline at end of file diff --git a/vendor/built_in_modules/page_content/app/controllers/panel/page_content/back_end/page_contexts_controller.rb b/vendor/built_in_modules/page_content/app/controllers/panel/page_content/back_end/page_contexts_controller.rb index 9b67fff07..6f5b2b062 100644 --- a/vendor/built_in_modules/page_content/app/controllers/panel/page_content/back_end/page_contexts_controller.rb +++ b/vendor/built_in_modules/page_content/app/controllers/panel/page_content/back_end/page_contexts_controller.rb @@ -53,6 +53,7 @@ class Panel::PageContent::BackEnd::PageContextsController < OrbitBackendControll # GET /page_contexts/1/edit def edit @page_context = PageContext.find(params[:id]) + @users = @page_context.get_users end # POST /page_contexts diff --git a/vendor/built_in_modules/page_content/app/models/page_context.rb b/vendor/built_in_modules/page_content/app/models/page_context.rb index 7c9bde354..5724b2655 100644 --- a/vendor/built_in_modules/page_content/app/models/page_context.rb +++ b/vendor/built_in_modules/page_content/app/models/page_context.rb @@ -18,6 +18,7 @@ class PageContext field :archived, :type => Boolean, :default => false # field :current, :type => Boolean, :default => false + field :user_ids belongs_to :page @@ -32,5 +33,9 @@ class PageContext def is_top? self.is_top end + + def get_users + User.find(self.user_ids) rescue [] + end end \ No newline at end of file diff --git a/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_form.html.erb b/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_form.html.erb index caef96329..a682d94c6 100644 --- a/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_form.html.erb +++ b/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_form.html.erb @@ -2,6 +2,22 @@ <%= f.error_messages %> + +
    + +
    +
    + +
    +

    <%= t(:promoter) %>

    +
    + <%= render partial: 'admin/member_selects/selection_box', locals: {field: 'page_context[user_ids][]', users: @users} %> +
    +
    + +
    + +
    diff --git a/vendor/built_in_modules/page_content/app/views/panel/page_content/front_end/page_contexts/index.html.erb b/vendor/built_in_modules/page_content/app/views/panel/page_content/front_end/page_contexts/index.html.erb index 3e607ad4c..50479523d 100644 --- a/vendor/built_in_modules/page_content/app/views/panel/page_content/front_end/page_contexts/index.html.erb +++ b/vendor/built_in_modules/page_content/app/views/panel/page_content/front_end/page_contexts/index.html.erb @@ -9,3 +9,4 @@
    <%= @page_context.context.html_safe rescue '' %>
    +<%= render partial: 'admin/member_selects/promoter_front', locals: {users: @page_context.get_users} %> \ No newline at end of file