From 480072a21cb5475f6e856e40c8ce976e9b9d1800 Mon Sep 17 00:00:00 2001 From: Bohung Date: Wed, 19 May 2021 21:54:38 +0800 Subject: [PATCH] Fix bug. --- announcement.gemspec | 6 +- app/assets/javascripts/bulletin/wpex.min.js | 134 ++++++++++++++++++- modules/announcement/_annc_widget15.html.erb | 131 +++++++++++------- modules/announcement/info.json | 1 + 4 files changed, 220 insertions(+), 52 deletions(-) diff --git a/announcement.gemspec b/announcement.gemspec index 3400efb..49ae6e1 100644 --- a/announcement.gemspec +++ b/announcement.gemspec @@ -114,9 +114,11 @@ if bundle_update_flag if !last_index.nil? default_announcement_widget_info.each do |h| name_without_index = h["name"]["zh_tw"].sub(/\d+/,'') - if (widget_info.select{|hh| hh["name"]["zh_tw"].include?(name_without_index)}.count == 0) + widget_info_index = (widget_info.index{|hh| hh["name"]["zh_tw"].include?(name_without_index)} rescue -1) + if widget_info_index == -1 update_flag = true copy_h = h.dup + h.delete("force_cover") last_index = last_index + 1 copy_h["filename"] = copy_h["filename"].sub(/\d+/){|ff| last_index.to_s} copy_h["name"].keys.each do |locale| @@ -124,6 +126,8 @@ if bundle_update_flag end widget_info << copy_h Bundler.with_clean_env{%x[cp -f #{app_path}/modules/announcement/_#{h["filename"]}.html.erb #{folder}modules/announcement/_#{copy_h["filename"]}.html.erb]} + elsif h["force_cover"] == "true" + Bundler.with_clean_env{%x[cp -f #{app_path}/modules/announcement/_#{h["filename"]}.html.erb #{folder}modules/announcement/_#{widget_info[widget_info_index]["filename"]}.html.erb]} end end if update_flag diff --git a/app/assets/javascripts/bulletin/wpex.min.js b/app/assets/javascripts/bulletin/wpex.min.js index 56241c2..b78ed34 100644 --- a/app/assets/javascripts/bulletin/wpex.min.js +++ b/app/assets/javascripts/bulletin/wpex.min.js @@ -1,4 +1,42 @@ -(function () { "use strict"; function e() { } function t(e, t) { for (var n = e.length; n--;)if (e[n].listener === t) return n; return -1 } var n = e.prototype; n.getListeners = function (e) { var t, n, i = this._getEvents(); if ("object" == typeof e) { t = {}; for (n in i) i.hasOwnProperty(n) && e.test(n) && (t[n] = i[n]) } else t = i[e] || (i[e] = []); return t }, n.flattenListeners = function (e) { var t, n = []; for (t = 0; e.length > t; t += 1)n.push(e[t].listener); return n }, n.getListenersAsObject = function (e) { var t, n = this.getListeners(e); return n instanceof Array && (t = {}, t[e] = n), t || n }, n.addListener = function (e, n) { var i, r = this.getListenersAsObject(e), o = "object" == typeof n; for (i in r) r.hasOwnProperty(i) && -1 === t(r[i], n) && r[i].push(o ? n : { listener: n, once: false }); return this }, n.on = n.addListener, n.addOnceListener = function (e, t) { return this.addListener(e, { listener: t, once: true }) }, n.once = n.addOnceListener, n.defineEvent = function (e) { return this.getListeners(e), this }, n.defineEvents = function (e) { for (var t = 0; e.length > t; t += 1)this.defineEvent(e[t]); return this }, n.removeListener = function (e, n) { var i, r, o = this.getListenersAsObject(e); for (r in o) o.hasOwnProperty(r) && (i = t(o[r], n), -1 !== i && o[r].splice(i, 1)); return this }, n.off = n.removeListener, n.addListeners = function (e, t) { return this.manipulateListeners(false, e, t) }, n.removeListeners = function (e, t) { return this.manipulateListeners(true, e, t) }, n.manipulateListeners = function (e, t, n) { var i, r, o = e ? this.removeListener : this.addListener, s = e ? this.removeListeners : this.addListeners; if ("object" != typeof t || t instanceof RegExp) for (i = n.length; i--;)o.call(this, t, n[i]); else for (i in t) t.hasOwnProperty(i) && (r = t[i]) && ("function" == typeof r ? o.call(this, i, r) : s.call(this, i, r)); return this }, n.removeEvent = function (e) { var t, n = typeof e, i = this._getEvents(); if ("string" === n) delete i[e]; else if ("object" === n) for (t in i) i.hasOwnProperty(t) && e.test(t) && delete i[t]; else delete this._events; return this }, n.emitEvent = function (e, t) { var n, i, r, o, s = this.getListenersAsObject(e); for (r in s) if (s.hasOwnProperty(r)) for (i = s[r].length; i--;)n = s[r][i], o = n.listener.apply(this, t || []), (o === this._getOnceReturnValue() || n.once === true) && this.removeListener(e, s[r][i].listener); return this }, n.trigger = n.emitEvent, n.emit = function (e) { var t = Array.prototype.slice.call(arguments, 1); return this.emitEvent(e, t) }, n.setOnceReturnValue = function (e) { return this._onceReturnValue = e, this }, n._getOnceReturnValue = function () { return this.hasOwnProperty("_onceReturnValue") ? this._onceReturnValue : true }, n._getEvents = function () { return this._events || (this._events = {}) }, "function" == typeof define && define.amd ? define(function () { return e }) : "undefined" != typeof module && module.exports ? module.exports = e : this.EventEmitter = e }).call(this), function (e) { "use strict"; var t = document.documentElement, n = function () { }; t.addEventListener ? n = function (e, t, n) { e.addEventListener(t, n, false) } : t.attachEvent && (n = function (t, n, i) { t[n + i] = i.handleEvent ? function () { var t = e.event; t.target = t.target || t.srcElement, i.handleEvent.call(i, t) } : function () { var n = e.event; n.target = n.target || n.srcElement, i.call(t, n) }, t.attachEvent("on" + n, t[n + i]) }); var i = function () { }; t.removeEventListener ? i = function (e, t, n) { e.removeEventListener(t, n, false) } : t.detachEvent && (i = function (e, t, n) { e.detachEvent("on" + t, e[t + n]); try { delete e[t + n] } catch (i) { e[t + n] = void 0 } }); var r = { bind: n, unbind: i }; "function" == typeof define && define.amd ? define(r) : e.eventie = r }(this), function (e) { "use strict"; function t(e, t) { for (var n in t) e[n] = t[n]; return e } function n(e) { return "[object Array]" === c.call(e) } function i(e) { var t = []; if (n(e)) t = e; else if ("number" == typeof e.length) for (var i = 0, r = e.length; r > i; i++)t.push(e[i]); else t.push(e); return t } function r(e, n) { function r(e, n, s) { if (!(this instanceof r)) return new r(e, n); "string" == typeof e && (e = document.querySelectorAll(e)), this.elements = i(e), this.options = t({}, this.options), "function" == typeof n ? s = n : t(this.options, n), s && this.on("always", s), this.getImages(), o && (this.jqDeferred = new o.Deferred); var a = this; setTimeout(function () { a.check() }) } function c(e) { this.img = e } r.prototype = new e, r.prototype.options = {}, r.prototype.getImages = function () { this.images = []; for (var e = 0, t = this.elements.length; t > e; e++) { var n = this.elements[e]; "IMG" === n.nodeName && this.addImage(n); for (var i = n.querySelectorAll("img"), r = 0, o = i.length; o > r; r++) { var s = i[r]; this.addImage(s) } } }, r.prototype.addImage = function (e) { var t = new c(e); this.images.push(t) }, r.prototype.check = function () { function e(e, r) { return t.options.debug && a && s.log("confirm", e, r), t.progress(e), n++, n === i && t.complete(), true } var t = this, n = 0, i = this.images.length; if (this.hasAnyBroken = false, !i) return this.complete(), void 0; for (var r = 0; i > r; r++) { var o = this.images[r]; o.on("confirm", e), o.check() } }, r.prototype.progress = function (e) { this.hasAnyBroken = this.hasAnyBroken || !e.isLoaded; var t = this; setTimeout(function () { t.emit("progress", t, e), t.jqDeferred && t.jqDeferred.notify(t, e) }) }, r.prototype.complete = function () { var e = this.hasAnyBroken ? "fail" : "done"; this.isComplete = true; var t = this; setTimeout(function () { if (t.emit(e, t), t.emit("always", t), t.jqDeferred) { var n = t.hasAnyBroken ? "reject" : "resolve"; t.jqDeferred[n](t) } }) }, o && (o.fn.imagesLoaded = function (e, t) { var n = new r(this, e, t); return n.jqDeferred.promise(o(this)) }); var f = {}; return c.prototype = new e, c.prototype.check = function () { var e = f[this.img.src]; if (e) return this.useCached(e), void 0; if (f[this.img.src] = this, this.img.complete && void 0 !== this.img.naturalWidth) return this.confirm(0 !== this.img.naturalWidth, "naturalWidth"), void 0; var t = this.proxyImage = new Image; n.bind(t, "load", this), n.bind(t, "error", this), t.src = this.img.src }, c.prototype.useCached = function (e) { if (e.isConfirmed) this.confirm(e.isLoaded, "cached was confirmed"); else { var t = this; e.on("confirm", function (e) { return t.confirm(e.isLoaded, "cache emitted confirmed"), true }) } }, c.prototype.confirm = function (e, t) { this.isConfirmed = true, this.isLoaded = e, this.emit("confirm", this, t) }, c.prototype.handleEvent = function (e) { var t = "on" + e.type; this[t] && this[t](e) }, c.prototype.onload = function () { this.confirm(true, "onload"), this.unbindProxyEvents() }, c.prototype.onerror = function () { this.confirm(false, "onerror"), this.unbindProxyEvents() }, c.prototype.unbindProxyEvents = function () { n.unbind(this.proxyImage, "load", this), n.unbind(this.proxyImage, "error", this) }, r } var o = e.jQuery, s = e.console, a = s !== void 0, c = Object.prototype.toString; "function" == typeof define && define.amd ? define(["eventEmitter/EventEmitter", "eventie/eventie"], r) : e.imagesLoaded = r(e.EventEmitter, e.eventie) }(window); (function (window) { +(function () { + "use strict"; + if (!Array.prototype.findIndex) { + Object.defineProperty(Array.prototype, 'findIndex', { + value: function(predicate) { + // 1. Let O be ? ToObject(this value). + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + var o = Object(this); + // 2. Let len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; + // 3. If IsCallable(predicate) is false, throw a TypeError exception. + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. + var thisArg = arguments[1]; + // 5. Let k be 0. + var k = 0; + // 6. Repeat, while k < len + while (k < len) { + // a. Let Pk be ! ToString(k). + // b. Let kValue be ? Get(O, Pk). + // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). + // d. If testResult is true, return k. + var kValue = o[k]; + if (predicate.call(thisArg, kValue, k, o)) { + return k; + } + // e. Increase k by 1. + k++; + } + // 7. Return -1. + return -1; + } + }); + } + function e() { } function t(e, t) { for (var n = e.length; n--;)if (e[n].listener === t) return n; return -1 } var n = e.prototype; n.getListeners = function (e) { var t, n, i = this._getEvents(); if ("object" == typeof e) { t = {}; for (n in i) i.hasOwnProperty(n) && e.test(n) && (t[n] = i[n]) } else t = i[e] || (i[e] = []); return t }, n.flattenListeners = function (e) { var t, n = []; for (t = 0; e.length > t; t += 1)n.push(e[t].listener); return n }, n.getListenersAsObject = function (e) { var t, n = this.getListeners(e); return n instanceof Array && (t = {}, t[e] = n), t || n }, n.addListener = function (e, n) { var i, r = this.getListenersAsObject(e), o = "object" == typeof n; for (i in r) r.hasOwnProperty(i) && -1 === t(r[i], n) && r[i].push(o ? n : { listener: n, once: false }); return this }, n.on = n.addListener, n.addOnceListener = function (e, t) { return this.addListener(e, { listener: t, once: true }) }, n.once = n.addOnceListener, n.defineEvent = function (e) { return this.getListeners(e), this }, n.defineEvents = function (e) { for (var t = 0; e.length > t; t += 1)this.defineEvent(e[t]); return this }, n.removeListener = function (e, n) { var i, r, o = this.getListenersAsObject(e); for (r in o) o.hasOwnProperty(r) && (i = t(o[r], n), -1 !== i && o[r].splice(i, 1)); return this }, n.off = n.removeListener, n.addListeners = function (e, t) { return this.manipulateListeners(false, e, t) }, n.removeListeners = function (e, t) { return this.manipulateListeners(true, e, t) }, n.manipulateListeners = function (e, t, n) { var i, r, o = e ? this.removeListener : this.addListener, s = e ? this.removeListeners : this.addListeners; if ("object" != typeof t || t instanceof RegExp) for (i = n.length; i--;)o.call(this, t, n[i]); else for (i in t) t.hasOwnProperty(i) && (r = t[i]) && ("function" == typeof r ? o.call(this, i, r) : s.call(this, i, r)); return this }, n.removeEvent = function (e) { var t, n = typeof e, i = this._getEvents(); if ("string" === n) delete i[e]; else if ("object" === n) for (t in i) i.hasOwnProperty(t) && e.test(t) && delete i[t]; else delete this._events; return this }, n.emitEvent = function (e, t) { var n, i, r, o, s = this.getListenersAsObject(e); for (r in s) if (s.hasOwnProperty(r)) for (i = s[r].length; i--;)n = s[r][i], o = n.listener.apply(this, t || []), (o === this._getOnceReturnValue() || n.once === true) && this.removeListener(e, s[r][i].listener); return this }, n.trigger = n.emitEvent, n.emit = function (e) { var t = Array.prototype.slice.call(arguments, 1); return this.emitEvent(e, t) }, n.setOnceReturnValue = function (e) { return this._onceReturnValue = e, this }, n._getOnceReturnValue = function () { return this.hasOwnProperty("_onceReturnValue") ? this._onceReturnValue : true }, n._getEvents = function () { return this._events || (this._events = {}) }, "function" == typeof define && define.amd ? define(function () { return e }) : "undefined" != typeof module && module.exports ? module.exports = e : this.EventEmitter = e }).call(this), function (e) { "use strict"; var t = document.documentElement, n = function () { }; t.addEventListener ? n = function (e, t, n) { e.addEventListener(t, n, false) } : t.attachEvent && (n = function (t, n, i) { t[n + i] = i.handleEvent ? function () { var t = e.event; t.target = t.target || t.srcElement, i.handleEvent.call(i, t) } : function () { var n = e.event; n.target = n.target || n.srcElement, i.call(t, n) }, t.attachEvent("on" + n, t[n + i]) }); var i = function () { }; t.removeEventListener ? i = function (e, t, n) { e.removeEventListener(t, n, false) } : t.detachEvent && (i = function (e, t, n) { e.detachEvent("on" + t, e[t + n]); try { delete e[t + n] } catch (i) { e[t + n] = void 0 } }); var r = { bind: n, unbind: i }; "function" == typeof define && define.amd ? define(r) : e.eventie = r }(this), function (e) { "use strict"; function t(e, t) { for (var n in t) e[n] = t[n]; return e } function n(e) { return "[object Array]" === c.call(e) } function i(e) { var t = []; if (n(e)) t = e; else if ("number" == typeof e.length) for (var i = 0, r = e.length; r > i; i++)t.push(e[i]); else t.push(e); return t } function r(e, n) { function r(e, n, s) { if (!(this instanceof r)) return new r(e, n); "string" == typeof e && (e = document.querySelectorAll(e)), this.elements = i(e), this.options = t({}, this.options), "function" == typeof n ? s = n : t(this.options, n), s && this.on("always", s), this.getImages(), o && (this.jqDeferred = new o.Deferred); var a = this; setTimeout(function () { a.check() }) } function c(e) { this.img = e } r.prototype = new e, r.prototype.options = {}, r.prototype.getImages = function () { this.images = []; for (var e = 0, t = this.elements.length; t > e; e++) { var n = this.elements[e]; "IMG" === n.nodeName && this.addImage(n); for (var i = n.querySelectorAll("img"), r = 0, o = i.length; o > r; r++) { var s = i[r]; this.addImage(s) } } }, r.prototype.addImage = function (e) { var t = new c(e); this.images.push(t) }, r.prototype.check = function () { function e(e, r) { return t.options.debug && a && s.log("confirm", e, r), t.progress(e), n++, n === i && t.complete(), true } var t = this, n = 0, i = this.images.length; if (this.hasAnyBroken = false, !i) return this.complete(), void 0; for (var r = 0; i > r; r++) { var o = this.images[r]; o.on("confirm", e), o.check() } }, r.prototype.progress = function (e) { this.hasAnyBroken = this.hasAnyBroken || !e.isLoaded; var t = this; setTimeout(function () { t.emit("progress", t, e), t.jqDeferred && t.jqDeferred.notify(t, e) }) }, r.prototype.complete = function () { var e = this.hasAnyBroken ? "fail" : "done"; this.isComplete = true; var t = this; setTimeout(function () { if (t.emit(e, t), t.emit("always", t), t.jqDeferred) { var n = t.hasAnyBroken ? "reject" : "resolve"; t.jqDeferred[n](t) } }) }, o && (o.fn.imagesLoaded = function (e, t) { var n = new r(this, e, t); return n.jqDeferred.promise(o(this)) }); var f = {}; return c.prototype = new e, c.prototype.check = function () { var e = f[this.img.src]; if (e) return this.useCached(e), void 0; if (f[this.img.src] = this, this.img.complete && void 0 !== this.img.naturalWidth) return this.confirm(0 !== this.img.naturalWidth, "naturalWidth"), void 0; var t = this.proxyImage = new Image; n.bind(t, "load", this), n.bind(t, "error", this), t.src = this.img.src }, c.prototype.useCached = function (e) { if (e.isConfirmed) this.confirm(e.isLoaded, "cached was confirmed"); else { var t = this; e.on("confirm", function (e) { return t.confirm(e.isLoaded, "cache emitted confirmed"), true }) } }, c.prototype.confirm = function (e, t) { this.isConfirmed = true, this.isLoaded = e, this.emit("confirm", this, t) }, c.prototype.handleEvent = function (e) { var t = "on" + e.type; this[t] && this[t](e) }, c.prototype.onload = function () { this.confirm(true, "onload"), this.unbindProxyEvents() }, c.prototype.onerror = function () { this.confirm(false, "onerror"), this.unbindProxyEvents() }, c.prototype.unbindProxyEvents = function () { n.unbind(this.proxyImage, "load", this), n.unbind(this.proxyImage, "error", this) }, r } var o = e.jQuery, s = e.console, a = s !== void 0, c = Object.prototype.toString; "function" == typeof define && define.amd ? define(["eventEmitter/EventEmitter", "eventie/eventie"], r) : e.imagesLoaded = r(e.EventEmitter, e.eventie) }(window); (function (window) { var slice = Array.prototype.slice; function noop() { } function defineBridget($) { if (!$) { return } @@ -2416,6 +2454,99 @@ var wpex = {}; } $(containers).each(function (i,v) { var $container = $(v); + if($(v).find(window.wpexAnimsition.linkElement).length != 1){ + if(!window.already_change){ + var $filter = $container.parent().find(window.wpexAnimsition.filter_bar); + var $filterLinks = $filter.find(window.wpexAnimsition.filter_option); + var $divs = []; + $filterLinks.each(function (i,v) { + var filter_constraint = get_filter_constraint($(v)); + var $div = $("
"); + var filter_constraints = filter_constraint.split(",") + filter_constraints.forEach(function(vv){ + var rm_attr = ""; + if(vv[0] == "["){ + var attr_pair = vv.slice(1,-1).split("="); + attr_pair = attr_pair.map(function(v){ return v.match(/[^"^']+/)[0]}) + $div.attr(attr_pair[0],attr_pair[1]); + rm_attr = attr_pair[0]; + }else if(vv[0] == "."){ + $div.attr('class',vv.slice(1)); + rm_attr = 'class'; + }else if(vv[0] == "#"){ + $div.attr('id',vv.slice(1)); + rm_attr = 'id'; + } + var linkElements = $container.parent().find(window.wpexAnimsition.linkElement).filter(vv); + if(linkElements.length != 0){ + var parents_elements = window.wpexAnimsition.linkElement.split(/>| /).slice(0,-1).filter(function(v){return v!=""}); + parents_elements = parents_elements.reverse(); + var parent_el = null; + parents_elements.forEach(function(vvv){ + if(parent_el == null){ + parent_el = linkElements.parents(vvv) + }else{ + parent_el = parent_el.parents(vvv) + } + }) + $div.append(parent_el.eq(0).prop("outerHTML")); + $div.find(window.wpexAnimsition.linkElement).remove(); + linkElements.removeAttr(rm_attr); + linkElements.appendTo($div.find("*").eq(-1)); + } + }) + $divs.push($div.prop("outerHTML")); + }) + $(v).before($divs.join("")); + var parents_text = window.wpexAnimsition.container_block.split(',').map(function(t){ + var str_arr = t.split(/>| /); + return ((str_arr.length <= 1) ? "*" : str_arr[0]); + }).join(","); + var parent_node = $(v).parents(parents_text); + $(v).remove(); + var activeItems; + var $filter = parent_node.find(window.wpexAnimsition.filter_bar); + if ($filter.length) { + var $filterLinks = $filter.find(window.wpexAnimsition.filter_option); + activeItems = ''; + if($filterLinks.length != 0){ + var filter_constraint = get_filter_constraint($filterLinks.eq(0)); + $filterLinks.each(function(){ + var filter_constraint = get_filter_constraint($(this)); + var inactive_node = parent_node.find(filter_constraint).not(window.wpexAnimsition.filter_option); + inactive_node.css("display","none"); + inactive_node.find("> *").addClass("hidden_item"); + inactive_node.find("> *").removeClass("active"); + }) + var active_node = parent_node.find(filter_constraint).not(window.wpexAnimsition.filter_option) + active_node.css("display",""); + active_node.find("> *").removeClass("hidden_item"); + active_node.find("> *").eq(0).addClass("active"); + active_node.find("> *").eq(0).css("display",""); + active_node.find(window.wpexAnimsition.linkElement).css("display",""); + } + $filterLinks.click(function () { + var filter_constraint = get_filter_constraint($(this)); + $filterLinks.each(function(){ + var filter_constraint = get_filter_constraint($(this)); + var inactive_node = parent_node.find(filter_constraint).not(window.wpexAnimsition.filter_option); + inactive_node.css("display","none"); + inactive_node.find("> *").addClass("hidden_item"); + inactive_node.find("> *").removeClass("active"); + }) + var active_node = parent_node.find(filter_constraint).not(window.wpexAnimsition.filter_option) + active_node.css("display",""); + active_node.find("> *").removeClass("hidden_item"); + active_node.find("> *").eq(0).addClass("active"); + active_node.find("> *").eq(0).css("display",""); + active_node.find(window.wpexAnimsition.linkElement).css("display",""); + active_node.find(window.wpexAnimsition.children_text_block).css("height",""); + return false; + }) + } + } + return; + } $container.imagesLoaded(function () { var activeItems; var $filter = $container.parent().find(window.wpexAnimsition.filter_bar); @@ -2446,6 +2577,7 @@ var wpex = {}; }); }) }) + window.already_change = true; }, customHovers: function () { }, responsiveCSS: function () { var headCSS = ''; var mediaObj = {}; var bkPoints = {}; $('.wpex-vc-rcss').remove(); bkPoints.d = ''; bkPoints = $.extend(bkPoints, wpexLocalize.responsiveDataBreakpoints); $.each(bkPoints, function (key) { mediaObj[key] = '' }); $('[data-wpex-rcss]').each(function (index, value) { var $this = $(this); var uniqueClass = 'wpex-rcss-' + index; var data = $this.data('wpex-rcss'); $this.addClass(uniqueClass); $.each(data, function (key, val) { var thisVal = val; var target = key; $.each(bkPoints, function (key) { if (thisVal[key]) { mediaObj[key] += '.' + uniqueClass + '{' + target + ':' + thisVal[key] + '!important;}' } }) }) }); $.each(mediaObj, function (key, val) { if ('d' == key) { headCSS += val } else { if (val) { headCSS += '@media (max-width: ' + bkPoints[key] + ') { ' + val + ' }' } } }); if (headCSS) { headCSS = ''; this.config.$head.append(headCSS) } }, vcexFilterNav: function ($context) { diff --git a/modules/announcement/_annc_widget15.html.erb b/modules/announcement/_annc_widget15.html.erb index 3d66823..f7fc3fe 100644 --- a/modules/announcement/_annc_widget15.html.erb +++ b/modules/announcement/_annc_widget15.html.erb @@ -39,45 +39,63 @@