From 485f66bad8999af44a6a88ab356701f88b330581 Mon Sep 17 00:00:00 2001 From: WebDitto Date: Thu, 14 Aug 2025 11:33:47 -0300 Subject: [PATCH] feat: Added pt/SakuraMangas (close #7946) (#10079) * feat: Added pt/SakuraMangas (close #7946) * chore: Fixed some reviews --------- Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com> --- src/pt/sakuramangas/build.gradle | 8 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4526 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2468 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6177 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 11572 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 16423 bytes .../extension/pt/sakuramangas/SakuraMangas.kt | 322 ++++++++++++++++++ .../pt/sakuramangas/SakuraMangasDto.kt | 60 ++++ .../pt/sakuramangas/SakuraMangasFilter.kt | 38 +++ 9 files changed, 428 insertions(+) create mode 100644 src/pt/sakuramangas/build.gradle create mode 100644 src/pt/sakuramangas/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/pt/sakuramangas/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/pt/sakuramangas/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/pt/sakuramangas/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/pt/sakuramangas/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangas.kt create mode 100644 src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasDto.kt create mode 100644 src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasFilter.kt diff --git a/src/pt/sakuramangas/build.gradle b/src/pt/sakuramangas/build.gradle new file mode 100644 index 000000000..ca190b001 --- /dev/null +++ b/src/pt/sakuramangas/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Sakura Mangás' + extClass = '.SakuraMangas' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/sakuramangas/res/mipmap-hdpi/ic_launcher.png b/src/pt/sakuramangas/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d689f154ab7b98018257d173fe9341c00f538642 GIT binary patch literal 4526 zcmV;f5mD}mP)Px`Xh}ptRCr$PTnAK?SK5A<0R|ZAP{jg*BKBYx6V ze9!y5<=$`X@VpsB!0tIdh7ouUkP(JF2k1FK)``e-2HB871m^!2K$QUKW3-tvVL^`` zJ-p;{d304(Rk%W-a8xK1dONn{oVoWHx?X)?+Sk$l1p+~(NF++Jx3~W#IXPJhK>uV+ zV1%$!r%p{|GTF|;!oto9g~Cm#R0>psP%1Sag6jY3$IZP)-@V5AHg+G4x$YW;Kp-gg z@bI`U7K&6bfUdQfWW6FW|oPP2A9R#wKCxyuQ9Iy-y;M zoD~QJV{>zJ^Yt;w5I_zgAtB>RN=m*|DwXc00%8q7>i3#6X>+bs{|-AlyCOF?x7kvu z^alXdx>%$SAUf{k@9)1zp-?PRH>>{(CfS-P2F9!q3Wckxs;X82sL&0vVEd@mn+iVArIczbe9}*{bOzAKje+cS= z3RxAtOFD`p>E}@;uSOGBA57^m3{lM^kXe|G)faXkvw-5c+GY$OW9PN{unr(~k=7^H z<}imcpl0sA*fMwl!X-hlt8)_s(wc;w`0dF(EbB83p`J})S9dby$vsRwuoREV3XFnd zu0sG|TY$7#WEMC81Q1|l)C`OZAIOtc0YtzRRhFV$UI~8}iAKyu*KNGC7aK3`Ws|cd zlWYo*x!~vm&)>xhyGAWXutyWkxJ+MeU3dIkRuW!2xD3^DnMr15iYe9sZ5@Mjc`;oR zS3hP4JGeNA;O6K8ft>(l)fFhLEQMSlM}&WCY#ID6e4IV%*+alr%BqoD_5?2WBKSCa z)|(eGt6CvLT;@f*ar{$ME99X59fkG~2_0D6secu-%+w!p5bJA_b_x{DkAvLZ-3@v% zbvsZWSW`D&ybX}Z)f-V+vN%c_NAQ0r-{1| z=G7c4`uz`DdIoaECcnH8d+waTj-;c=F3D%}iw^37j=rJrbMZoPRT)m-y@Ded7f@bZ zX|nmL9%xOTX*+;)nV2p%eGoYXe`-Gz(n4U480n zdJl>pVR`&FNH54nn4|?(^qmf&oe=My{sPA{6XELMjK6doiPs}y*aWG+h6hvoH<{Vs zAKpSnLAJS`&N>F^14v&?DaIpM%koVj;Rrw-}!YBn)3Q-E<0*dxR<5Ivf-!-TdkqK%{l z=&6=fS3+oK$ILi=?<%GpS&f%k^<|LAIAT*y<5qqemiC#(6T6X@ifM;e<8ehHGiPQ* z3^RvgCNRmsPOF4J2>-GtFIk{n0#Ar?_rX2bRPs)pM
s7fY}WMD_u7IOE*j0HU= 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 M07*qoM6N<$g0`ZA`~Uy| literal 0 HcmV?d00001 diff --git a/src/pt/sakuramangas/res/mipmap-mdpi/ic_launcher.png b/src/pt/sakuramangas/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e51a91422c1058341ded53ad2a02f958859de846 GIT binary patch literal 2468 zcmV;V30wAwP)Px;UP(kjRA@u(S_xEC*BSmEGYl{r1B@fPf@@F~3GN!VXc~9i6Fo#BmZW-2s-}$^ z+mJ-@Sd+BYMpKI`6&LCf6*b~g5hX6DP-8;?kww`VW`=DT-?aC_jKlZ_9)ic?Il1R> znD=<^zyJ4t-+%xA&V|8CKA4x>fBXXAMKjnM1LSXZzzb)|2!I7Zem^xh0R#jDNLiNs zO0UHU#5{dS+EW5m{tW0N(fD3@o&(Ck0PN$3N zEQdP+%Ji;GCW}+6)$ai?Sc0$yK&~b3?(UBa27{Dulx;E88IGH52m}J1Ua$86P-7`4 zE&wh{rLw}7^Oh3oh=bO4_}F4u)(t>aTL4^@N@Y1;ty@R`d9Y!!$+D~xKxLZ%+}zwK zfVMz9FE(u1Z8rcDt!)9Ze6Fk572&;JgRZd-hyHsWb&d5HINN( zbrnw)NiI1VjYfV+Yy!|40~<##!HnLcsIw2X_%?k@oN|H2NC6;Wro?uI@!##t9q=UyuG>{HfMS02&N>+^>Fw zUM@a#shxj32G<__*f{{4ot-%gnONw68rCa$$uE$JhTG) zr^cY7t{Msl8G5;RV|e^~hzgp5MS&Bs|6Ve54Yd&3332|x4P=z%;K0<+G2A;4tdYgB ztQ35Z{AV<>23twZPeO9JoHGZAb`OWgnq^a*yM!7G`it2>?F^WHOn}RcLAGOe`Nbk4`|eOva9k6Ld{~ zy?Yog=HJ5NQ?bxLHqacYZqQ+fM?c&y{h8JQ%k^C*l3;xIFwE*R1|z+Lk@(XEe3<+f zDksa8&mxfR17OX7$>{j*1F>S@TTKP3d63C7OLNdq>5oEfDK_6Yh{s0O>@Wcn9Xt)Q z`i_N=v7;@5zM5wL16UMvKT>*B{;zG6CRX zU~%wNEDD^2qgj`5EIY;AU0O~i6^Rktr3Wq-W`L|*HI4Of6pFBG;wQA#IF*}*(wa)V z(|@9wK_Z)&%RBJx?W3G~@8$>jF(8phI2m}wts73x{t^Pljz*6Ju%xB}*;R#5*K6tW z=qYuBzrqW@yYM%hdvFtz{D-2vPEF@eFV4c5xnILmqQuV3lNjX_LZ5A}h0s54MA+^~ zl+;w3L6{LXec%s(EBbT#j>DfuFEQIBGTD%}m)3wGUj69(irQ*y{NbM%*F6kTNwL^8 zW+{qmDlop=KrBjHk1+SX*fM@Ol5(zK)3pS|Px&JSWI{1|-%{MG$mfU|>? z_WONYeQEnZ`u*9*K0$9+9}1$bu>oRxN4y;{9((_D20Jp3~mBa=2)ek8% zm*#(iJ(;KQ?d@Y!RulXNQHKk(B^VL^KI#n(R)IHP@?(Gi;9`K7aS}RUTF;SKJuCuJ zdncq6+(Cb(KNJp92nA$KXOOKf#Kc1@@S6cM@L|{-B>b3+5LHjwT8Hjhh$W#j@$2Ae zv~G}1P*uGa$8#=YYx-g2svp{Np1*{goSa(S54brw<9ftDXc02if~F(}D(f|vd1N(B z-orCu;UKWb`YXHf`@st!uoECMX&p5BS{$18h522QL&M{vZOO(G5I+VS9UY&NkjV;R z#??uV8xe6Jo0=!94}&6Y85Sjd0iC`MiQ(&zRhf^B(j2+*ULkB(B<)Ju7|#ZPOHQPaEqiq~Z41bL;7HcL5tF(TzH$}f-dqKDi5r4;L_ph6 zgY4)-=JsQEW)jw>Y{#vIyWr*|r~Z;k{_(}FZ8^_hLJkfNtukPmDM0B5Uzv&)r$TKR z=JXwl*irApQ6Qp^Bc6bd;R z;G4{?eV^0;=lM%WC=@;*2OaH+{*!|C#KjKE#TqL)*dR?Efk3bgz+2W9o|S

llV1I}S0I1GcuCo#d>gnOXoz0M-B?%4pH5avk!K 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 literal 0 HcmV?d00001 diff --git a/src/pt/sakuramangas/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/sakuramangas/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..922a0488a8e9ac94bb258098e54f935509b8b206 GIT binary patch literal 11572 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 ir|@y4F#jj&vrg4Umyg6tDhb9QZ$5F$#?U literal 0 HcmV?d00001 diff --git a/src/pt/sakuramangas/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/sakuramangas/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0e14b357c5abf47be06ad2295f7ac71d67287a GIT binary patch literal 16423 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


n^+dtrAehdBKVR4+)C{EkFLmqF~%LTEM zk+=LkEdtP0EBth_D@7bSZh>ZJ7r!jC^oJk*Eef_VT(I-Z`7lGlrh`9 z@sq3i=lFnKt240@K)Y{W0N@Cw=l?A){)4;*NBz5!t3)s)^B*8Dts+$|Ve = emptySet() + private var demographyOptions: List> = listOf( + "Todos" to "", + ) + private var classificationOptions: List> = listOf( + "Todos" to "", + ) + private var orderByOptions: List> = listOf( + "Lidos" to "3", + ) + + override fun headersBuilder() = super.headersBuilder() + .set("Referer", "$baseUrl/") + .set("X-Requested-With", "XMLHttpRequest") + + // ================================ Popular ======================================= + + override fun popularMangaRequest(page: Int): Request = + searchMangaRequest(page, "", FilterList()) + + override fun popularMangaParse(response: Response): MangasPage = searchMangaParse(response) + + // ================================ Latest ======================================= + + override fun latestUpdatesRequest(page: Int): Request = + GET("$baseUrl/dist/sakura/models/home/home_ultimos.php", headers) + + override fun latestUpdatesParse(response: Response): MangasPage { + val result = response.parseAs>() + + val mangas = result.map { + val element = Jsoup.parseBodyFragment(it, baseUrl) + SManga.create().apply { + title = element.selectFirst(".h5-titulo")!!.text() + setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) + thumbnail_url = element.selectFirst("img")?.absUrl("src") + } + } + + return MangasPage(mangas, hasNextPage = false) + } + + // ================================ Search ======================================= + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val form = FormBody.Builder() + .add("seach", query) + .add("order", "3") + .add("offset", ((page - 1) * 15).toString()) + .add("limit", "15") + + val inclGenres = mutableListOf() + val exclGenres = mutableListOf() + + var demography: String? = null + var classification: String? = null + var orderBy: String? = null + + filters.forEach { filter -> + when (filter) { + is GenreList -> filter.state.forEach { + when (it.state) { + Filter.TriState.STATE_INCLUDE -> inclGenres.add(it.id) + Filter.TriState.STATE_EXCLUDE -> exclGenres.add(it.id) + else -> {} + } + } + + is DemographyFilter -> demography = filter.getValue().ifEmpty { null } + is ClassificationFilter -> classification = filter.getValue().ifEmpty { null } + is OrderByFilter -> orderBy = filter.getValue().ifEmpty { null } + else -> {} + } + } + + inclGenres.forEach { form.add("tags[]", it) } + exclGenres.forEach { form.add("excludeTags[]", it) } + + demography?.let { form.add("demography", it) } + classification?.let { form.add("classification", it) } + orderBy?.let { form.add("order", it) } + + return POST("$baseUrl/dist/sakura/models/obras/obras_buscar.php", headers, form.build()) + } + + fun searchMangaFromElement(element: Element) = SManga.create().apply { + title = element.selectFirst(".h5-titulo")!!.text() + thumbnail_url = element.selectFirst("img.img-pesquisa")?.absUrl("src") + description = element.selectFirst(".p-sinopse")?.text() + + setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) + } + + override fun searchMangaParse(response: Response): MangasPage { + val result = response.parseAs() + val seriesList = + result.asJsoup("$baseUrl/obras/").select(".result-item").map(::searchMangaFromElement) + return MangasPage(seriesList, result.hasMore) + } + + // ================================ Details ======================================= + + override fun getMangaUrl(manga: SManga): String = "$baseUrl${manga.url}" + + private fun mangaDetailsApiRequest(mangaId: String): Request { + val form = FormBody.Builder() + .add("manga_id", mangaId) + .add("dataType", "json") + + return POST("$baseUrl/dist/sakura/models/manga/manga_info.php", headers, form.build()) + } + + override fun mangaDetailsParse(response: Response): SManga { + val document = response.asJsoup() + val mangaId = document.selectFirst("meta[manga-id]")!!.attr("manga-id") + + return client.newCall(mangaDetailsApiRequest(mangaId)).execute() + .parseAs().toSManga(document.baseUri()) + } + + // ================================ Chapters ======================================= + + private fun chapterListApiRequest(mangaId: String, page: Int): Request { + val form = FormBody.Builder() + .add("manga_id", mangaId) + .add("offset", ((page - 1) * 90).toString()) + .add("order", "desc") + .add("limit", "90") + + return POST("$baseUrl/dist/sakura/models/manga/manga_capitulos.php", headers, form.build()) + } + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + val mangaId = document.selectFirst("meta[manga-id]")!!.attr("manga-id") + + var page = 1 + val chapters = mutableListOf() + do { + val doc = client.newCall(chapterListApiRequest(mangaId, page++)).execute().asJsoup() + + val chapterGroup = doc.select(".capitulo-item").map(::chapterFromElement).also { + chapters += it + } + } while (chapterGroup.isNotEmpty()) + + return chapters + } + + fun chapterFromElement(element: Element) = SChapter.create().apply { + name = buildString { + element.selectFirst(".num-capitulo") + ?.text() + ?.let { append(it) } + + element.selectFirst(".cap-titulo") + ?.text() + ?.takeIf { it.isNotBlank() } + ?.let { append(" - $it") } + } + scanlator = element.selectFirst(".scan-nome")?.text() + chapter_number = + element + .selectFirst(".num-capitulo")!! + .attr("data-chapter") + .toFloatOrNull() ?: 1F + date_upload = element.selectFirst(".cap-data")?.text()?.toDate() ?: 0L + setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) + } + + // ================================ Pages ======================================= + + private fun pageListApiRequest(chapterId: String, token: String): Request { + val form = FormBody.Builder() + .add("chapter_id", chapterId) + .add("token", token) + + return POST( + "$baseUrl/dist/sakura/models/capitulo/capitulos_read.php", + headers, + form.build(), + ) + } + + override fun pageListParse(response: Response): List { + val document = response.asJsoup() + + val chapterId = document.selectFirst("meta[chapter-id]")!!.attr("chapter-id") + val token = document.selectFirst("meta[token]")!!.attr("token") + + val response = client.newCall(pageListApiRequest(chapterId, token)).execute() + .parseAs() + + val baseUrl = document.baseUri().trimEnd('/') + + return response.imageUrls.mapIndexed { index, url -> + Page( + index, + imageUrl = "$baseUrl/$url".toHttpUrl().toString(), + ) + } + } + + override fun imageUrlParse(response: Response): String = "" + + override fun getFilterList(): FilterList { + thread { + fetchFilters() + } + + return FilterList( + OrderByFilter("Ordenar por", orderByOptions, "order"), + DemographyFilter("Demografia", demographyOptions, "demography"), + ClassificationFilter("Classificação", classificationOptions, "classification"), + GenreList( + title = "Gêneros", + genres = genresSet.toTypedArray(), + ), + ) + } + + private fun fetchFilters() { + if (genresSet.isNotEmpty()) { + return + } + + try { + val document = client + .newCall(GET("$baseUrl/obras/", headers)) + .execute() + .asJsoup() + + genresSet = document.select(".genero-badge").map { element -> + val id = element.attr("data-value") + Genre(element.ownText(), id) + }.toSet() + + val demoOpts = document.select("select#demografia-select option").mapNotNull { opt -> + val value = opt.attr("value").orEmpty() + val text = opt.text().trim() + if (text.isEmpty()) null else text to value + } + if (demoOpts.isNotEmpty()) demographyOptions = demoOpts + + val classOpts = + document.select("select#classificacao-select option").mapNotNull { opt -> + val value = opt.attr("value").orEmpty() + val text = opt.text().trim() + if (text.isEmpty()) null else text to value + } + if (classOpts.isNotEmpty()) classificationOptions = classOpts + + val orderOptions = document.select("select#ordenar-por option").mapNotNull { opt -> + val value = opt.attr("value").orEmpty() + val text = opt.text().trim() + if (text.isEmpty()) null else text to value + } + if (orderOptions.isNotEmpty()) orderByOptions = orderOptions + } catch (e: Exception) { + Log.e("SakuraMangas", "failed to fetch genres", e) + } + } + + private fun String.toDate(): Long { + val trimmedDate = this.split(" ") + + if (trimmedDate[0] != "Há") return 0L + + val number = trimmedDate[1].toIntOrNull() ?: return 0L + + val unit = trimmedDate[2] + + val javaUnit = when (unit) { + "ano", "anos" -> Calendar.YEAR + "mês", "meses" -> Calendar.MONTH + "semana", "semanas" -> Calendar.WEEK_OF_MONTH + "dia", "dias" -> Calendar.DAY_OF_MONTH + "hora", "horas" -> Calendar.HOUR + "minuto", "minutos" -> Calendar.MINUTE + "segundo", "segundos" -> Calendar.SECOND + else -> return 0L + } + + val now = Calendar.getInstance() + + now.add(javaUnit, -number) + + return now.timeInMillis + } +} diff --git a/src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasDto.kt b/src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasDto.kt new file mode 100644 index 000000000..898e0b178 --- /dev/null +++ b/src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasDto.kt @@ -0,0 +1,60 @@ +package eu.kanade.tachiyomi.extension.pt.sakuramangas + +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.Serializable +import okhttp3.HttpUrl.Companion.toHttpUrl +import org.jsoup.Jsoup +import org.jsoup.nodes.Document + +@Serializable +class SakuraMangasResultDto( + val hasMore: Boolean, + private val html: String, +) { + + fun asJsoup(baseUri: String = ""): Document { + return Jsoup.parseBodyFragment(this.html, baseUri) + } +} + +@Serializable +class SakuraMangaInfoDto( + private val titulo: String, + private val autor: String?, + private val sinopse: String?, + private val tags: List, + private val demografia: String?, + private val status: String, + private val ano: Int?, + private val classificacao: String?, + private val avaliacao: Double?, +) { + fun toSManga(mangaUrl: String): SManga = SManga.create().apply { + title = titulo + author = autor + genre = tags.joinToString() + status = when (this@SakuraMangaInfoDto.status) { + "concluído" -> SManga.COMPLETED + "em andamento" -> SManga.ONGOING + else -> SManga.UNKNOWN + } + description = buildString { + sinopse?.takeIf { it.isNotBlank() }?.let { + appendLine(it) + appendLine() + } + ano?.let { appendLine("Ano: $it") } + demografia?.takeIf { it.isNotBlank() }?.let { appendLine("Demografia: $it") } + classificacao?.takeIf { it.isNotBlank() }?.let { appendLine("Classificação: $it") } + avaliacao?.let { appendLine("Avaliação: $it") } + }.trim() + thumbnail_url = "${mangaUrl.trimEnd('/')}/thumb_256.jpg" + url = mangaUrl.toHttpUrl().encodedPath + initialized = true + } +} + +@Serializable +class SakuraMangaChapterReadDto( + val imageUrls: List, +) diff --git a/src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasFilter.kt b/src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasFilter.kt new file mode 100644 index 000000000..1786146ab --- /dev/null +++ b/src/pt/sakuramangas/src/eu/kanade/tachiyomi/extension/pt/sakuramangas/SakuraMangasFilter.kt @@ -0,0 +1,38 @@ +package eu.kanade.tachiyomi.extension.pt.sakuramangas + +import eu.kanade.tachiyomi.source.model.Filter + +class GenreList(title: String, genres: Array) : + Filter.Group(title, genres.map { GenreCheckBox(it.name, it.id) }) + +class GenreCheckBox(name: String, val id: String = name) : Filter.TriState(name) + +class Genre(val name: String, val id: String) + +open class SingleSelectFilter( + name: String, + private val options: List>, + val paramKey: String, + state: Int = 0, +) : Filter.Select(name, options.map { it.first }.toTypedArray(), state) { + fun getValue(): String = options.getOrNull(state)?.second.orEmpty() +} + +class DemographyFilter( + name: String, + options: List>, + paramKey: String, +) : SingleSelectFilter(name, options, paramKey) + +class ClassificationFilter( + name: String, + options: List>, + paramKey: String, +) : SingleSelectFilter(name, options, paramKey) + +class OrderByFilter( + name: String, + options: List>, + paramKey: String, + state: Int = 0, +) : SingleSelectFilter(name, options, paramKey, state)