lariv-rs 0.1.0

Compile-time plugin web application framework built on Axum, SeaORM, Maud, and HTMX
Documentation
use frunk::Generic;
use maud::{Markup, html};

use crate::{
    components::{
        FieldText, ObjectList, ShellChrome, TableColumnHeader, TableRow, column_sort_url,
        data_table_list_refresh, field_text, row_attr_select, sort_indicator,
    },
    picker::RenderPickerSelect,
    template::RenderTemplate,
};

use crate::plugins::finance_accounts::keys::{SourceDocSelectModalKey, SourceDocSelectTableKey};

use super::common::render_picker_pagination;

#[derive(Clone)]
pub struct SourceDocRow {
    pub id: i64,
    pub source_doc_type: String,
    pub source_doc_id: i64,
    pub label: String,
}

#[derive(Generic)]
pub struct SourceDocSelectPage {
    pub docs: ObjectList<SourceDocRow>,
    pub target_input: String,
    pub sort: String,
    pub path_and_query: String,
    pub page_size: u32,
}

impl RenderPickerSelect<SourceDocSelectTableKey, SourceDocSelectModalKey> for SourceDocSelectPage {
    fn render_table(&self) -> Markup {
        let type_sort = column_sort_url(&self.path_and_query, "Type", &self.sort);
        let reference_sort = column_sort_url(&self.path_and_query, "Reference", &self.sort);
        let type_label = format!("Type{}", sort_indicator(&self.sort, "Type"));
        let reference_label = format!("Reference{}", sort_indicator(&self.sort, "Reference"));
        let headers = [
            TableColumnHeader {
                key: "Type",
                label: &type_label,
                sort_url: Some(&type_sort),
                push_url: false,
            },
            TableColumnHeader {
                key: "Reference",
                label: &reference_label,
                sort_url: Some(&reference_sort),
                push_url: false,
            },
            TableColumnHeader {
                key: "Label",
                label: "Label",
                sort_url: None,
                push_url: false,
            },
        ];
        let rows: Vec<TableRow> = self
            .docs
            .items
            .iter()
            .map(|d| TableRow {
                attrs: row_attr_select(&self.target_input, &d.id.to_string(), &d.label),
                cells: vec![
                    field_text(FieldText {
                        value: &d.source_doc_type,
                        classes: "",
                    }),
                    field_text(FieldText {
                        value: &d.source_doc_id.to_string(),
                        classes: "",
                    }),
                    field_text(FieldText {
                        value: &d.label,
                        classes: "",
                    }),
                ],
            })
            .collect();
        let pagination = render_picker_pagination::<SourceDocSelectModalKey>(
            &self.path_and_query,
            self.docs.number,
            self.docs.num_pages,
        );
        data_table_list_refresh::<SourceDocSelectTableKey>(
            "Select Source Document",
            html! {},
            &headers,
            &rows,
            pagination,
            &self.path_and_query,
        )
    }
}

impl RenderTemplate for SourceDocSelectPage {
    fn render(&self, _chrome: &ShellChrome) -> Markup {
        self.render_modal().into_inner()
    }
}