Skip to content
Snippets Groups Projects
Commit b1c927dc authored by David Smadja's avatar David Smadja
Browse files

Add lawArticle context Toc

parent 07f49770
No related branches found
No related tags found
No related merge requests found
import { dbConnection } from "$lib/server/db-connect"
import { dbConnect } from "$lib/server/db-connect"
import type { Handle } from "@sveltejs/kit"
export const handle: Handle = async ({ event, resolve }) => {
const sql = await dbConnection()
if (!event.locals.sql) {
const sql = await dbConnect()
event.locals = { sql }
}
return await resolve(event)
}
<script lang="ts">
import Toc from "$lib/components/Toc.svelte"
import type { LegiArticle } from "@tricoteuses/legifrance"
interface Props {
articleJson: LegiArticle
}
let { articleJson }: Props = $props()
console.log({ articleJson })
$inspect(articleJson)
let tocIsOpen = $state(false)
let articleNum: String | undefined = $derived(
articleJson ? articleJson.META?.META_SPEC?.META_ARTICLE?.NUM : undefined,
......@@ -25,8 +27,40 @@
return articleJson.CONTEXTE.TEXTE.TITRE_TXT[0]["@c_titre_court"]
}
})
let lastTMText = $derived(getLastTMText(articleJson))
function getLastTMText(article: LegiArticle): string | undefined {
let currentTm = article.CONTEXTE?.TEXTE?.TM
while (currentTm?.TM) {
currentTm = currentTm.TM
}
if (!currentTm?.TITRE_TM) return undefined
const validEntries = currentTm.TITRE_TM.filter(
(entry) =>
entry["@debut"] && entry["@fin"] && entry["@debut"] < entry["@fin"],
)
if (validEntries.length === 0) return undefined
const sortedEntries = [...validEntries].sort((a, b) =>
b["@debut"].localeCompare(a["@debut"]),
)
return sortedEntries[0]?.["#text"]
}
</script>
<button
class="cursor-pointer underline"
onclick={() => (tocIsOpen = !tocIsOpen)}
>
&#62; {lastTMText}
</button><br />
{#if tocIsOpen}
<Toc {articleJson} lienSectionTA={undefined} init={true} open={true}></Toc>
{/if}
{#if articleNum !== undefined}
<span class="font-bold">Article {articleNum}</span>
{/if}
......
<script lang="ts">
import BillSummary from "./BillSummary.svelte"
import BillSummary from "$lib/components/BillSummary.svelte"
interface Props {
billHTML: string | undefined
}
......
<script lang="ts">
import type {
LegiArticle,
LegiSectionTaLienSectionTa,
} from "@tricoteuses/legifrance"
import Toc from "./Toc.svelte"
interface Props {
articleJson: LegiArticle
lienSectionTA: LegiSectionTaLienSectionTa | undefined
init: boolean
open: boolean
}
let { articleJson, lienSectionTA, init, open }: Props = $props()
let titreTM = $state("")
let structTA: LegiSectionTaLienSectionTa[] | undefined = $state(undefined)
if (init === true) {
//Initialization - need to get SCTA struct from Textelr instead of section_ta
const legiTextId = articleJson.CONTEXTE.TEXTE["@cid"]
if (!legiTextId) {
console.error("Cannot get ID of context text from article JSON")
}
fetch(`/api/toc/${legiTextId}`)
.then((res) => (res.ok ? res.json() : null))
.then((data) => (structTA = data))
.catch(() => (structTA = undefined))
titreTM = getCurrentContextTitreTxt(articleJson)
} else {
const legiSCTAid = lienSectionTA?.["@cid"]
fetch(`/api/toc/${legiSCTAid}`)
.then((res) => (res.ok ? res.json() : null))
.then((data) => (structTA = data))
.catch(() => (structTA = undefined))
titreTM = lienSectionTA!["#text"] || "Titre inconnu"
}
function getCurrentContextTitreTxt(article: LegiArticle): string {
let titresTxtArray = article.CONTEXTE?.TEXTE?.TITRE_TXT
const validEntries = titresTxtArray.filter(
(entry) =>
entry["@debut"] && entry["@fin"] && entry["@debut"] < entry["@fin"],
)
if (validEntries.length === 0) return "Titre inconnu"
const sortedEntries = [...validEntries].sort((a, b) =>
b["@debut"].localeCompare(a["@debut"]),
)
return sortedEntries[0]?.["#text"]
}
</script>
<details bind:open>
<summary>
{titreTM}
</summary>
{#if structTA && open}
<ul class="translate-1">
{#each structTA as nextLienSectionTA}
<li>
<Toc
{articleJson}
lienSectionTA={nextLienSectionTA}
init={false}
open={false}
/>
</li>
{/each}
</ul>
{/if}
</details>
......@@ -2,7 +2,7 @@ import postgres from "postgres"
import config from "$lib/server/config"
export async function dbConnection() {
export async function dbConnect() {
try {
const sql = postgres({
host: config.db.host,
......@@ -10,7 +10,7 @@ export async function dbConnection() {
port: config.db.port,
username: config.db.username,
password: config.db.password,
max: 10,
max: 20,
})
return sql
} catch (error: unknown) {
......
......@@ -2,17 +2,20 @@ import { error, json } from "@sveltejs/kit"
import type { LegiArticle } from "@tricoteuses/legifrance"
import type { RequestHandler } from "./$types"
interface dataArticle {
interface queryDataArticle {
data: LegiArticle
}
export const GET: RequestHandler = async ({ params, locals }) => {
const { article } = params as { article: string }
const { sql } = locals
const articleTxtFromDb: dataArticle[] = await sql<JSON>`
const dbConnection = await sql.reserve()
const articleTxtFromDb: queryDataArticle[] = await dbConnection<JSON>`
select data
from article
where id=${article}`
dbConnection.release()
if (articleTxtFromDb.length === 1) {
const data = json(articleTxtFromDb[0].data)
......
import { error, json } from "@sveltejs/kit"
import type { LegiTextelrStructure } from "@tricoteuses/legifrance"
import type { RequestHandler } from "./$types"
interface queryDataStructData {
struct_data: LegiTextelrStructure
}
export const GET: RequestHandler = async ({ params, locals }) => {
const { id } = params as { id: string }
const { sql } = locals
const dbConnection = await sql.reserve()
switch (true) {
case id.startsWith("LEGITEXT"): {
const structDataFromDb: queryDataStructData[] = await dbConnection<JSON>`
select jsonb_path_query(data, '$.STRUCT') AS struct_data
from textelr
where id = ${id}`
await dbConnection.release()
if (structDataFromDb.length !== 1) {
return json(undefined)
}
const structData = structDataFromDb[0].struct_data.LIEN_SECTION_TA
if (structData)
return json(
structData.filter(
(lienSectionTA) => lienSectionTA["@etat"] === "VIGUEUR",
),
)
else {
return json(undefined)
}
}
case id.startsWith("LEGISCTA"): {
const structDataFromDb: queryDataStructData[] = await dbConnection<JSON>`
select jsonb_path_query(data, '$.STRUCTURE_TA') AS struct_data
from section_ta
where id = ${id}`
await dbConnection.release()
if (structDataFromDb.length !== 1) {
return json(undefined)
}
const structData = structDataFromDb[0].struct_data.LIEN_SECTION_TA
if (structData) {
return json(
structData.filter(
(lienSectionTA) => lienSectionTA["@etat"] === "VIGUEUR",
),
)
} else {
return json(undefined)
}
}
default:
error(
422,
"Error : dealing with ids other than LEGITEXT or LEGISCTA are not implemented yet",
)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment