2020-02-01 03:47:52 +00:00
module AnnouncementsHelper
2024-10-17 02:52:13 +00:00
extend self
2022-04-19 09:46:07 +00:00
def data_to_human_type ( a , set_tag_ids = nil , tmp_enable_annc_dept = false , annc_depts = [ ] )
tmp_enable_annc_dept = @tmp_enable_annc_dept if @tmp_enable_annc_dept
annc_depts = @annc_depts if @annc_depts
2020-03-01 07:49:01 +00:00
statuses = a . statuses_with_classname . collect do | status |
{
" status " = > status [ " name " ] ,
" status-class " = > " status- #{ status [ 'classname' ] } "
}
end
files = a . bulletin_files . map { | file | { " file_url " = > file . file . url , " file_title " = > ( file . title . blank? ? File . basename ( file . file . path ) : file . title rescue '' ) } if file . enabled_for? ( locale ) } rescue [ ]
files . delete ( nil )
links = a . bulletin_links . map { | link | { " link_url " = > link . url , " link_title " = > ( link . title . blank? ? link . url : link . title ) } } rescue [ ]
2022-06-21 03:11:33 +00:00
author = tmp_enable_annc_dept ? annc_depts [ a . annc_dept ] : User . find ( a . update_user_id ) . member_profile . name rescue " "
2020-03-01 07:49:01 +00:00
desc = a . image_description
desc = ( desc . nil? || desc == " " ? " announcement image " : desc )
2020-05-19 04:31:57 +00:00
link_to_show = ( a . is_external_link? ? a . external_link : OrbitHelper . widget_item_url ( a . to_param ) ) rescue " "
2020-03-01 07:49:01 +00:00
target = a . is_external_link ? " _blank " : " _self "
if @image_version == 'thumb'
image_url = a . image . thumb . url
elsif @image_version == 'mobile'
image_url = a . image . mobile . url
else
image_url = a . image . url
end
2021-11-12 07:47:02 +00:00
doc = Nokogiri :: HTML ( a . title )
title = doc . text . empty? ? 'no content' : doc . text
2020-03-01 07:49:01 +00:00
{
2021-12-11 11:13:08 +00:00
" is_top " = > a . is_top ,
2020-03-01 07:49:01 +00:00
" bulletin_links " = > links ,
" bulletin_files " = > files ,
2022-03-29 06:25:10 +00:00
" sort_number " = > a . sort_number ,
2020-03-01 07:49:01 +00:00
" title " = > a . title ,
" source-site " = > " " ,
" source-site-title " = > " " ,
" source-site-link " = > " " ,
" subtitle " = > a . subtitle ,
" statuses " = > statuses ,
2021-09-16 09:15:44 +00:00
" category " = > ( a . category . title rescue " " ) ,
2021-04-09 09:45:58 +00:00
" tag_ids " = > ( set_tag_ids . nil? ? ( a . tag_ids . map { | id | id . to_s } . to_s . gsub ( '"' , " ' " ) rescue '[]' ) : set_tag_ids ) ,
2020-03-01 07:49:01 +00:00
" postdate " = > a . postdate ,
" author " = > author ,
2021-11-12 07:44:55 +00:00
" link_to_show " = > link_to_show + " \" #{ ( link_to_show [ 0 ] == '/' rescue true ) ? '' : 'target="_blank"' } title= \" #{ title } " ,
2020-03-01 07:49:01 +00:00
" target " = > target ,
2023-02-02 08:10:39 +00:00
" img_src " = > image_url || AnnouncementsController :: DefaultImgSrc ,
2020-03-01 07:49:01 +00:00
" img_description " = > desc
}
end
2024-10-13 13:42:37 +00:00
def get_feed_annc ( type , site_source , locale , categories = nil , max_len = nil , sort_maps = nil , extra_match_cond = nil )
2020-04-05 14:38:26 +00:00
ma_key = 'announcement'
2021-09-15 12:50:30 +00:00
if categories . nil?
if type == " index "
categories = Array ( OrbitHelper . page_categories )
elsif type == " widget "
categories = Array ( OrbitHelper . widget_categories )
else
categories = [ ]
end
2020-04-05 14:38:26 +00:00
end
2021-09-15 12:50:30 +00:00
categories = [ " all " ] if categories . length == 0
2024-10-13 13:42:37 +00:00
data = SiteFeedAnnc . get_feed_cache (
ma_key ,
categories ,
site_source ,
locale ,
type == 'widget' ,
max_len ,
sort_maps ,
extra_match_cond
)
2020-04-05 14:38:26 +00:00
data
end
2024-10-13 13:42:37 +00:00
def get_feed_announcements ( type , site_source = nil , categories = nil , max_len = nil , extra_match_cond = [ ] )
2020-02-01 03:47:52 +00:00
locale = OrbitHelper . get_site_locale . to_s
2024-10-13 13:42:37 +00:00
feeds = [ ]
feeds_count = 0
2020-04-05 14:38:26 +00:00
if ! ( defined? SiteFeedAnnc ) . nil?
2024-10-13 13:42:37 +00:00
sort_maps = { is_top : :desc , postdate : :desc , id : :desc }
match_cond = {
" is_hidden " = > { " $ne " = > true } ,
" $and " = > [
{ " postdate " = > { " $lte " = > Time . now } } ,
{
" $or " = > [
{ " deadline " = > { " $gte " = > Time . now } } ,
{ " deadline " = > nil }
]
}
] ,
" title " = > { " $gt " = > " " }
2020-03-02 10:09:55 +00:00
}
2024-10-13 13:42:37 +00:00
if ! extra_match_cond . empty?
match_cond [ " $and " ] += extra_match_cond
end
feeds , feeds_count = get_feed_annc ( type , site_source , locale , categories , max_len , sort_maps , match_cond )
2020-03-02 10:09:55 +00:00
end
2024-10-13 13:42:37 +00:00
return feeds , feeds_count
2020-02-01 03:47:52 +00:00
end
2024-10-13 13:42:37 +00:00
2020-04-25 04:35:30 +00:00
def get_sorted_annc ( data_count = nil )
2020-02-01 03:47:52 +00:00
params = OrbitHelper . params
locale = OrbitHelper . get_site_locale . to_s
2020-03-01 07:49:01 +00:00
page_number = OrbitHelper . page_number . to_i
page_number = 1 if page_number == 0
2020-04-25 04:35:30 +00:00
page_data_count = data_count || OrbitHelper . page_data_count . to_i
2020-02-01 03:47:52 +00:00
feeds_anns = [ ]
2024-10-13 13:42:37 +00:00
page = OrbitHelper . page
2020-05-19 04:31:57 +00:00
if @type == " show_widget "
tags = @tags
categories = @categories
else
tags = page . tags
2020-12-16 09:33:52 +00:00
tags = params [ :tags ] if params [ :tags ] . present?
2022-01-20 06:55:23 +00:00
categories = params [ 'category' ] == 'all' ? ( page . categories || [ ] ) : ( params [ 'category' ] . nil? ? ( page . categories || [ ] ) : Array ( params [ 'category' ] ) )
2021-09-16 09:15:44 +00:00
if params [ 'category' ] . present? && tags . blank?
2021-05-11 02:14:49 +00:00
tags = [ " all " ]
end
2020-05-19 04:31:57 +00:00
end
2024-10-13 13:42:37 +00:00
announcements_list = [ ]
announcements = [ ]
feeds_count = 0
extra_match_cond = [ ]
if ! params [ :keywords ] . blank?
extra_match_cond << {
" title_plain_text " = > OrbitHelper . get_keyword_regex ( params [ :keywords ] )
}
end
if ! params [ :stime ] . blank?
stime = OrbitHelper . get_time_from_str ( params [ :stime ] )
extra_match_cond << {
" postdate " = > { " $gte " = > stime }
}
end
if ! params [ :etime ] . blank?
etime = OrbitHelper . get_time_from_str ( params [ :etime ] ) + 1 . days
extra_match_cond << {
" postdate " = > { " $lt " = > etime }
}
end
2020-03-01 07:49:01 +00:00
if ! params [ " source " ] . present?
2024-10-13 13:42:37 +00:00
announcements = Bulletin . can_display_and_sorted
. filter_by_categories ( categories , false ) . filter_by_tags ( tags )
. where ( :title . nin = > [ " " , nil ] )
if ! extra_match_cond . empty?
announcements = announcements . and ( extra_match_cond )
end
2020-05-19 04:31:57 +00:00
if @type == " show_widget "
2024-10-13 13:42:37 +00:00
if ! params [ :uids ] . blank?
2022-02-27 04:58:52 +00:00
member_profile = MemberProfile . any_in ( :uid = > params [ :uids ] )
user_ids = member_profile . map { | m | m . user . id rescue nil } . select { | id | ! id . nil? }
2024-10-13 13:42:37 +00:00
announcements = announcements . where ( :update_user_id . in = > user_ids )
2020-05-19 04:31:57 +00:00
end
end
2024-10-13 13:42:37 +00:00
if ! ( defined? SiteFeed ) . nil? && @type != " show_widget "
feeds_anns , feeds_count = get_feed_announcements ( " index " , nil , categories , page_number * page_data_count , extra_match_cond )
2020-05-19 04:31:57 +00:00
end
2024-10-13 13:42:37 +00:00
elsif @type != " show_widget "
feeds_anns , feeds_count = get_feed_announcements ( " index " , params [ " source " ] , categories , page_number * page_data_count , extra_match_cond )
2020-02-01 03:47:52 +00:00
end
if ! feeds_anns . blank?
2024-11-16 03:25:13 +00:00
all_filter = sort_announcements ( announcements + feeds_anns )
2020-02-01 03:47:52 +00:00
else
2024-10-13 13:42:37 +00:00
all_filter = announcements
2020-02-01 03:47:52 +00:00
end
2020-03-01 07:49:01 +00:00
if page_data_count != 0
sorted = all_filter [ ( page_number - 1 ) * page_data_count ... page_number * page_data_count ]
else
sorted = all_filter
2020-02-28 04:18:43 +00:00
end
2024-10-13 13:42:37 +00:00
annc_count = announcements . count + feeds_count
2020-03-01 07:49:01 +00:00
total_pages = page_data_count == 0 ? 1 : ( annc_count . to_f / page_data_count ) . ceil
[ sorted , total_pages ]
2020-02-01 03:47:52 +00:00
end
2024-10-13 13:42:37 +00:00
def sort_announcements ( announcements )
if enable_manually_sort
announcements = announcements . sort_by { | announcement |
[
2024-11-16 03:25:13 +00:00
( announcement [ 'is_top' ] ? 0 : 1 ) ,
announcement [ 'sort_number' ] . to_i ,
- announcement [ " postdate " ] . to_i
2024-10-13 13:42:37 +00:00
]
2024-11-16 03:25:13 +00:00
}
2024-10-13 13:42:37 +00:00
else
announcements = announcements . sort_by { | announcement |
[
2024-11-16 03:25:13 +00:00
( announcement [ 'is_top' ] ? 0 : 1 ) ,
- announcement [ " postdate " ] . to_i
2024-10-13 13:42:37 +00:00
]
2024-11-16 03:25:13 +00:00
}
2024-10-13 13:42:37 +00:00
end
return announcements
end
2020-05-19 04:31:57 +00:00
def render_view_for_annc ( overridehtml = nil )
@key = Site . first . template
def render_link_to_edit ( html , url_to_edit )
if html . scan ( " {{link_to_edit}} " ) . length == 0
html = url_to_edit . blank? ? html : html + " <p class='admin-edit text-right'><a class='btn btn-primary' href=' #{ url_to_edit } '><i class='icon-edit'></i> #{ t ( :edit ) } </a></p> "
else
html = url_to_edit . blank? ? html . gsub ( " {{link_to_edit}} " , " " ) : html . gsub ( " {{link_to_edit}} " , " <p class='admin-edit text-right'><a class='btn btn-primary' href=' #{ url_to_edit } '><i class='icon-edit'></i> #{ t ( :edit ) } </a></p> " )
end
return html
end
def parsing_repeats_again ( elements , d , level )
newhtml = [ ]
oldhtml = [ ]
elements . each do | el |
html_to_render = " "
data_name = el . attr ( " data-list " )
wrap_elements = el . css ( " *[data-list][data-level=' #{ level } '] " )
if d [ data_name ]
d [ data_name ] . each_with_index do | item , i |
element = el . inner_html
if wrap_elements . count > 0
htmls = parsing_repeats_again ( wrap_elements , d [ data_name ] [ i ] , level + 1 )
htmls [ 0 ] . each_with_index do | html , i |
element = element . gsub ( html , htmls [ 1 ] [ i ] )
end
end
item . each do | key , value |
if ! value . kind_of? ( Array )
value = value . nil? ? " " : value
element = element . gsub ( " {{ #{ key } }} " , value . to_s . html_safe )
element = element . gsub ( " %7B%7B #{ key } %7D%7D " , value . to_s . html_safe )
element = render_link_to_edit ( element , value ) if key . eql? ( " url_to_edit " )
end
end
html_to_render = html_to_render + element
end
temp = el . to_s
oldhtml << temp
temp = temp . gsub ( el . inner_html , html_to_render )
newhtml << temp
end
end
[ oldhtml , newhtml ]
end
if @target_action == " index "
2022-11-01 05:19:10 +00:00
filename = File . basename ( overridehtml . nil? ? params [ :layout_type ] : overridehtml )
2020-05-19 04:31:57 +00:00
f = File . join ( Rails . root , 'app' , 'templates' , " #{ @key } " , 'modules' , 'announcement' , " #{ filename } .html.erb " )
2023-04-08 15:12:29 +00:00
if ! File . exist? f
2020-05-19 04:31:57 +00:00
f = File . join ( Rails . root , 'app' , 'templates' , " #{ @key } " , 'modules' , 'announcement' , " index.html.erb " )
2023-04-08 15:12:29 +00:00
if ! File . exist? f
2020-05-19 04:31:57 +00:00
return " <div class='well'>Maybe the administrator has changed the theme, please select the index page design again from the page settings.</div> " . html_safe
end
end
file = File . open ( f )
doc = Nokogiri :: HTML ( file , nil , " UTF-8 " )
file . close
controller = AnnouncementsController . new
begin
data = @data # rescue nil
rescue Exception = > e
write_debug_file ( e , 'announcements' , @target_action ) if Site :: DEBUG
end
if ! data . nil?
wrap_elements = doc . css ( " *[data-list][data-level='0'] " )
htmls = parsing_repeats_again ( wrap_elements , data , 1 )
html = doc . to_s
htmls [ 0 ] . each_with_index do | h , i |
html = html . gsub ( h , htmls [ 1 ] [ i ] )
end
extras = data [ " extras " ] || { }
extras [ " page-title " ] = Page . find_by ( :page_id = > params [ :page_id ] ) . name rescue " " if ! extras [ " page-title " ]
extras . each do | key , value |
value = value . nil? ? " " : value
html = html . gsub ( " {{ #{ key } }} " , value . to_s . html_safe )
html = html . gsub ( " %7B%7B #{ key } %7D%7D " , value . to_s . html_safe )
end
total_pages = data [ 'total_pages' ] . to_i rescue 1
if total_pages > 1
html = html . gsub ( " {{pagination_goes_here}} " , create_pagination ( total_pages ) )
else
html = html . gsub ( " {{pagination_goes_here}} " , " " ) ;
end
html . html_safe
else
return " <div class='well'>No content to show.</div> " . html_safe
end
else
filename = overridehtml . nil? ? @target_action : overridehtml
f = File . join ( Rails . root , 'app' , 'templates' , " #{ @key } " , 'modules' , 'announcement' , " #{ filename } .html.erb " )
2023-04-08 15:12:29 +00:00
if File . exist? f
2020-05-19 04:31:57 +00:00
file = File . open ( f )
doc = Nokogiri :: HTML ( file , nil , " UTF-8 " )
file . close
controller = AnnouncementsController . new
begin
data = @data # rescue nil
rescue Exception = > e
write_debug_file ( e , 'announcements' , @target_action ) if Site :: DEBUG
end
if data . nil?
return " <div class='well'> No content to show. </div> " . html_safe
end
if data . blank? || data . empty?
file = File . open ( " #{ Rails . root } /app/views/errors/404.html " )
doc = Nokogiri :: HTML ( file , nil , " UTF-8 " )
file . close
doc . to_html . html_safe
else
unless data [ 'impressionist' ] . blank?
Thread . new do
impression = data [ 'impressionist' ] . impressions . create
impression . user_id = request . session [ 'user_id' ]
impression . controller_name = 'announcements'
impression . action_name = @target_action
impression . ip_address = request . remote_ip
impression . session_hash = request . session . id
impression . request_hash = @impressionist_hash
impression . referrer = request . referrer
impression . save
end
data [ 'impressionist' ] . inc ( view_count : 1 )
data [ " data " ] [ " view_count " ] = data [ " impressionist " ] . view_count if data [ " data " ] . present?
end
wrap_elements = doc . css ( " *[data-list][data-level='0'] " )
if wrap_elements . count == 0
wrap_element_html = doc . to_s
el = wrap_element_html
data . each do | key , value |
next if key . eql? 'impressionist'
value = value . nil? ? " " : value
el = el . gsub ( " {{ #{ key } }} " , value . to_s . html_safe )
el = el . gsub ( " %7B%7B #{ key } %7D%7D " , value . to_s . html_safe )
end
el . html_safe
else
keys = data . keys
not_array_key = nil
data . keys . each do | key |
not_array_key = key if data [ " #{ key } " ] . kind_of? ( Hash )
end
htmls = parsing_repeats_again ( wrap_elements , data , 1 )
html = doc . to_s
htmls [ 0 ] . each_with_index do | h , i |
html = html . gsub ( h , htmls [ 1 ] [ i ] )
end
extras = data [ " #{ not_array_key } " ] || { }
extras . each do | key , value |
next if key . eql? 'impressionist'
value = value . nil? ? " " : value
html = html . gsub ( " {{ #{ key } }} " , value . to_s )
html = html . gsub ( " %7B%7B #{ key } %7D%7D " , value . to_s )
end
html = render_link_to_edit ( html , data [ " url_to_edit " ] ) if ! data [ " url_to_edit " ] . nil?
total_pages = data [ 'total_pages' ] . to_i rescue 1
2020-05-19 06:20:02 +00:00
if @show_page == " false "
2020-05-19 04:31:57 +00:00
html = html . gsub ( " {{pagination_goes_here}} " , " " )
else
if total_pages > 1
html = html . gsub ( " {{pagination_goes_here}} " , create_pagination ( total_pages ) )
else
html = html . gsub ( " {{pagination_goes_here}} " , " " )
end
end
html = Nokogiri :: HTML . parse ( html )
html . css ( '.i-annc__page-title' ) . remove
2020-05-19 06:10:12 +00:00
dates = html . css ( " *[date-format] " )
if ! dates . blank?
dates . each do | d |
2020-08-03 09:11:20 +00:00
begin
format = d . attributes [ " date-format " ] . value
date = DateTime . parse ( d . inner_text )
d . inner_html = d . inner_html . gsub ( d . inner_text . strip , " " + date . strftime ( format ) )
rescue
next
end
2020-05-19 06:10:12 +00:00
end
end
2021-02-21 04:31:22 +00:00
html . css ( " body " ) [ 0 ] . inner_html = html . css ( " body " ) [ 0 ] . inner_html . gsub ( " {{page-title}} " , " " )
2020-05-19 04:31:57 +00:00
html . css ( " body " ) . to_html . html_safe
end
end
else
return " <div class='well'>There is a problem with the design. We will try to fix it as soon as possible. Sorry for the inconvenience!! :(</div> " . html_safe
end
end
end
def get_layouts ( module_app )
layout_types = [ ]
@key = Site . first . template
f = File . join ( " #{ Rails . root } /app/templates/ #{ @key } /modules/ #{ module_app } /info.json " )
2023-04-08 15:12:29 +00:00
if File . exist? f
2020-05-19 04:31:57 +00:00
info = File . read ( f )
hash = JSON . parse ( info ) rescue { }
frontends = hash [ " frontend " ] || [ ]
frontends . each do | frontend |
frontend [ " thumbnail " ] = " /assets/ #{ module_app } /thumbs/ #{ frontend [ " thumbnail " ] } "
layout_types << frontend
end
end
if layout_types . empty?
Dir . glob ( " #{ Rails . root } /app/templates/ #{ @key } /modules/ #{ module_app } /* " ) . each do | w |
next if File . ftype ( w ) . eql? ( " directory " )
w = File . basename ( w , " .* " )
w = File . basename ( w , " .* " )
if w [ 0 , 1 ] != " _ " && w [ 0 , 1 ] != " s " && w != " info "
layout_types << w
end
end
end
layout_types
end
2021-09-16 09:15:44 +00:00
def render_ad_banner ( event_carousel_images , data )
( " <div class= \" carousel_images \" >
< div class = \ " w-ba-banner ba-banner-widget-1 \" >
< div class = \ " w-ba-banner__wrap cycle-slideshow \"
data - list = \ " event_carousel_images \"
data - level = \ " 0 \"
data - cycle - slides = \ " .event_carousel_slide \"
data - cycle - log = \ " false \"
data - cycle - auto - height = \ " 0 \"
data - cycle - speed = \ " 300 \"
data - cycle - timeout = \ " 5000 \"
data - cycle - fx = \ " fade \"
data - pager - active - class = \ " active-slide \"
data - cycle - swipe = true
data - cycle - swipe - fx = \ " scrollHorz \"
> " +
event_carousel_images . collect do | e |
" <div class= \" w-ba-banner__slide event_carousel_slide \"
data - cycle - title = \ " #{ e [ 'description_text' ] } \"
>
< img class = \ " w-ba-banner__image banner-responsive \" src= \" #{ e [ 'src' ] } \" alt= \" #{ e [ 'description_text' ] } \" >
< div class = \ " ad-overlay w-ad-banner__overlay event_carousel__overlay \" >
< p > < strong class = \ " carousel__description \" > #{ e [ 'description' ] } </strong></p>
< / div>
< div class = \ " transitionfade \" ></div>
< / div>"
end . join +
" </div>
< ul class = \ " controlplay \" ><a class= \" resume-slide \" title = \" #{ data [ 'resume_btn_title' ] } \" ><i></i></a><a class= \" pause-slide \" title = \" #{ data [ 'pause_btn_title' ] } \" ><i></i></a></ul>
< ul class = \ " button-mid \" >
< i class = \ " fa fa-angle-left prev-button \" aria-hidden= \" true \" title = \" #{ data [ 'prev_btn_title' ] } \" ></i>
< i class = \ " fa fa-angle-right next-button \" aria-hidden= \" true \" title = \" #{ data [ 'next_btn_title' ] } \" ></i>
< / ul>
< / div>
< div style = \ " position: relative; \" >
< h4 > < span class = \ " active_slide \" >1</span>/ #{ data [ 'carousel_count' ] } </h4>
< ul class = \ " carousel_images_slide w-annc__list row list-unstyled \" data-level= \" 0 \" data-list= \" event_carousel_images \" > " +
event_carousel_images . collect do | e |
" <li class= \" carousel_img_item col-sm-3 \" >
< div class = \ " carousel_img-wrap \" >
< img class = \ " carousel_img \" src= \" #{ e [ 'src' ] } \" alt= \" #{ e [ 'description_text' ] } \" >
< / div>
< / li>"
end . join +
" </ul>
< ul class = \ " button-mid \" >
< i class = \ " fa fa-angle-left prev-button prev_img \" aria-hidden= \" true \" title = \" #{ data [ 'prev_btn_title' ] } \" ></i>
< i class = \ " fa fa-angle-right next-button next_img \" aria-hidden= \" true \" title = \" #{ data [ 'next_btn_title' ] } \" ></i>
< / ul>
< / div>
< / div>").html_safe
end
2024-10-13 13:42:37 +00:00
2024-10-17 02:52:13 +00:00
def complementaryColor ( my_hex )
if my_hex [ 0 ] == '#'
my_hex = my_hex [ 1 .. - 1 ]
2024-10-13 13:42:37 +00:00
end
2024-10-17 02:52:13 +00:00
rgb = my_hex . split ( / / ) . each_slice ( my_hex . length / 3 ) . map { | v | v . join }
comp = rgb . map { | a | ( 255 - a . to_i ( 16 ) ) . to_s ( 16 ) . rjust ( 2 , '0' ) }
'#' + comp . join
end
def lighten_color ( my_hex , percent )
if my_hex [ 0 ] == '#'
my_hex = my_hex [ 1 .. - 1 ]
2024-10-13 13:42:37 +00:00
end
2024-10-17 02:52:13 +00:00
rgb = my_hex . split ( / / ) . each_slice ( my_hex . length / 3 ) . map { | v | v . join }
comp = rgb . collect do | a |
tmp = a . to_i ( 16 ) * ( 1 + percent / 100 . 0 )
tmp = 255 if tmp > 255
tmp = 0 if tmp < 0
tmp . to_i . to_s ( 16 ) . rjust ( 2 , '0' )
end
'#' + comp . join
end
def enable_manually_sort
if defined? ( OrbitHelper :: SharedHash ) && OrbitHelper :: SharedHash
OrbitHelper :: SharedHash [ 'announcement' ] [ :enable_manually_sort ]
else
AnnouncementSetting . first . enable_manually_sort rescue false
2024-10-13 13:42:37 +00:00
end
end
2020-02-01 03:47:52 +00:00
end