Skip to content

Commit

Permalink
fixed pagination for surah, jump is WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
naveed-ahmad committed Feb 27, 2021
1 parent b3412cc commit c1d6eca
Show file tree
Hide file tree
Showing 18 changed files with 257 additions and 261 deletions.
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ group :development do
# gem 'pronto-flay', require: false
# gem 'pronto-rubocop', require: false
# gem 'pronto-scss', require: false
# if you need to run webrick server for development
# rails server -u webrick
gem "webrick"
end

group :test do
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,7 @@ GEM
rack-proxy (>= 0.6.1)
railties (>= 5.2)
semantic_range (>= 2.3.0)
webrick (1.7.0)
websocket-driver (0.7.3)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
Expand Down Expand Up @@ -355,6 +356,7 @@ DEPENDENCIES
tzinfo-data
web-console (>= 4.1.0)
webpacker (>= 5.2.1)
webrick

RUBY VERSION
ruby 3.0.0p0
Expand Down
37 changes: 24 additions & 13 deletions app/controllers/chapters_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ def ayatul_kursi
end

def load_verses
# Allow infinite pagination to load more ayah when user scroll
params[:continue] = true

render layout: false
end

Expand All @@ -50,12 +47,11 @@ def check_routes
# /1/8 => invalid ayah
# /1/0 => /1

range = params[:range]
chapter = params[:id][/\d+/]

if (path, error = chapter.presence && validate_chapter_rules(chapter))
redirect_to path, error: error
elsif (path, error = range.presence && validate_range_rules(range))
elsif (path, error = validate_range_rules)
redirect_to path, error: error
end
end
Expand All @@ -70,26 +66,33 @@ def validate_chapter_rules(chapter)
end
end

def validate_range_rules(range)
def validate_range_rules
expected = get_valid_range_params

key_range_path(params[:id], range: expected) if expected != range
ayah_range_path(params[:id], range: expected) if expected != current_ayah_range
end

def get_valid_range_params
if params[:range].presence
start, finish = params[:range].split(/-|:/)
if params[:from].presence
start = params[:from]
finish = params[:to]

valid_start = start.to_i.abs
valid_end = finish.to_i.abs

unless finish
if finish.nil?
return valid_start.zero? ? nil : valid_start.to_s
end

valid_start, valid_end = valid_end, valid_start if valid_start > valid_end
valid_end = valid_start if valid_end.zero?

"#{valid_start}-#{valid_end}" if valid_start.positive?
if valid_start == valid_end
# 2/4-4 should redirect to 2/4
valid_start.to_s
else
"#{valid_start}-#{valid_end}"
end
end
end

Expand All @@ -101,8 +104,6 @@ def init_presenter
verse = Verse.find_by_verse_key(params[:verse])
params[:from] = verse.verse_number - 2
params[:to] = params[:from] + 5

params[:range] = "#{params[:from] }-#{params[:to]}"
@presenter = ChapterPresenter.new(self)
else
ChapterPresenter.new(self)
Expand All @@ -112,4 +113,14 @@ def init_presenter
def generate_localised_cache_key
"verses:xhr#{request.xhr?}/#{@presenter.cache_key}/#{fetch_locale}"
end

def current_ayah_range
if params[:from]
if params[:to]
"#{params[:from]}-#{params[:to]}"
else
params[:from]
end
end
end
end
62 changes: 42 additions & 20 deletions app/finders/verse_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,21 @@ def initialize(params)
@params = params
end

def random_verse(filters, language_code, words: true, translations: false, audio: false)
def random_verse(filters, language, words: true, translations: false)
@results = Verse.unscope(:order).where(filters).order('RANDOM()').limit(3)

load_translations(translations) if translations.present?
load_words(language_code) if words
load_audio(audio) if audio
load_words(language) if words

words_ordering = words ? ', words.position ASC, word_translations.priority ASC' : ''
@results.order("verses.verse_index ASC #{words_ordering}".strip).sample
end

def find_by_key(key, language_code, words: true, tafsirs: false, translations: false, audio: false)
def find_by_key(key, language:, words: true, translations: false)
@results = Verse.where(verse_key: key).limit(1)

load_translations(translations) if translations.present?
load_words(language_code) if words
load_audio(audio) if audio
load_tafsirs(tafsirs) if tafsirs.present?
load_words(language) if words

words_ordering = words ? ', words.position ASC, word_translations.priority ASC' : ''
@results.order("verses.verse_index ASC #{words_ordering}".strip).first
Expand Down Expand Up @@ -62,16 +59,22 @@ def current_page
protected

def fetch_by_chapter
if chapter = Chapter.find_by(id: params[:chapter_number].to_i.abs)
if chapter = Chapter.find_using_slug(params[:id])
@total_records = chapter.verses_count
verse_start = verse_pagination_start(@total_records)
verse_end = verse_pagination_end(verse_start, @total_records)

@next_page = current_page + 1 if verse_end < params[:to]
if params[:reading]
fetch_chapter_page(chapter)

@results
else
verse_start = verse_pagination_start(@total_records)
verse_end = verse_pagination_end(verse_start, @total_records)

@results = Verse
.where(chapter_id: params[:chapter_number].to_i.abs)
.where('verses.verse_number >= ? AND verses.verse_number <= ?', verse_start.to_i, verse_end.to_i)
@next_page = current_page + 1 if verse_end < (params[:to] || @total_records).to_i
@results = Verse
.where(chapter_id: chapter)
.where('verses.verse_number >= ? AND verses.verse_number <= ?', verse_start.to_i, verse_end.to_i)
end
else
@results = Verse.where('1=0')
end
Expand Down Expand Up @@ -159,22 +162,41 @@ def fetch_juz_page(juz)
end
end

def fetch_chapter_page(chapter)
# Reading mode will not use page, but start from last shown verse
# and load full page
last_verse = nil

if params[:after]
last_verse = Verse.where(chapter_id: chapter.id, id: params[:after]).first
end

last_verse ||= Verse.where(chapter_id: chapter.id, verse_number: params[:from] || 1).first
verse_to = (params[:to] || params[:from]).to_i

@results = rescope_verses('verse_index')
.where(chapter_id: chapter.id, page_number: last_verse.page_number)
.where('verses.verse_number >= ? AND verses.verse_number <= ?', params[:from].to_i, verse_to)

if @results.last.verse_number < verse_to
@next_page = current_page + 1
end
end

def verse_pagination_start(total_verses)
if (from = (params[:from] || 1).to_i.abs).zero?
from = 1
end

start = from + (current_page - 1) * per_page
verse_from = from + (current_page - 1) * per_page

min(start, total_verses)
min(verse_from, total_verses)
end

def verse_pagination_end(start, total_verses)
to = params[:to].presence ? params[:to].to_i.abs : nil
verse_to = min(to || total_verses, total_verses)
params[:to] = verse_to
verses_to = (params[:to] || params[:from] || total_verses).to_i

min((start + per_page), verse_to)
min((start + per_page), verses_to)
end

def load_words(word_trans_language)
Expand Down
33 changes: 23 additions & 10 deletions app/helpers/chapters_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,17 @@ def quran_script_types

def chapter_next_page_link
if @presenter.next_page
default_params = {
page: @presenter.next_page,
translations: @presenter.valid_translations,
reading: @presenter.reading_mode?
}
if @presenter.range.nil?
next_page_link = chapter_path(@presenter.chapter.id, default_params)
else
next_page_link = chapter_path(@presenter.chapter.id, @presenter.range, default_params)
end
next_page_link = if @presenter.reading_mode?
surah_reading_page_link
else
ayah_range_path(@presenter.chapter.id,
@presenter.ayah_range,
page: @presenter.next_page,
translations: @presenter.valid_translations,
reading: @presenter.reading_mode?)

end

link_to 'load more',
next_page_link,
rel: 'next',
Expand All @@ -41,6 +42,18 @@ def chapter_next_page_link
end
end

def surah_reading_page_link
if (last = @presenter.last_verse)
ayah_range_path(
@presenter.chapter,
@presenter.ayah_range,
page: @presenter.next_page,
after: last.id + 1,
reading: true
)
end
end

def juz_next_page_link
if @presenter.next_page
if @presenter.reading_mode?
Expand Down
41 changes: 39 additions & 2 deletions app/presenters/ayatul_kursi_presenter.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,45 @@
# frozen_string_literal: true

class AyatulKursiPresenter < ChapterPresenter
def initialize(context)
super

@finder = VerseFinder.new(params)
end

def verses
finder = VerseFinder.new(params)
strong_memoize :verses do
[@finder.find_by_key(
'2:255',
language: language,
translations: valid_translations,
words: true
)]
end
end

def translation_view_path
"/ayatul-kursi?reading=false"
end

def next_page
false
end

def reading_view_path
"/ayatul-kursi?reading=true"
end

def continue?
true
end

def continue_path
'/2/255-286'
end

def single_ayah?
true
end

def meta_url
Expand All @@ -18,7 +55,7 @@ def meta_keywords
end

def cache_key
'ayat-ul-kursi'
"ayat-ul-kursi-#{context.fetch_locale}"
end

def chapter
Expand Down
2 changes: 1 addition & 1 deletion app/presenters/base_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def initialize(context)
end

delegate :params, :session, :request, :action_name, to: :context
delegate :current_page, :next_page, :per_page, :total_records, to: :finder
delegate :current_page, :next_page, :per_page, :total_pages, :total_records, to: :finder

def active_tab
params[:reading] == 'true' ? 'reading' : 'translation'
Expand Down
Loading

0 comments on commit c1d6eca

Please sign in to comment.