<!--
    常规的分页查询页面，上部为查询条件面板和操作按钮区，中间为数据表格，底部为分页指示器
-->
<script lang="ts">

    import PaginationPanel from "@ticatec/uniface-element/PaginationPanel";
    import type {ActionsColumn, IndicatorColumn} from "@ticatec/uniface-element/DataTable";
    import type {DataColumn} from "@ticatec/uniface-element/DataTable";
    import {onMount, type Snippet} from "svelte";

    import type {IPagedDataManager} from "@ticatec/app-data-manager";
    import FilterPanel from "@ticatec/uniface-filter-panel";
    import "@ticatec/uniface-filter-panel/uniface-filter-panel.css";
    import type {ButtonActions} from "@ticatec/uniface-element/ActionBar";

    import DataTableBoard from "..";

    import i18nRes from "../../i18nRes";
    import unifaceProCtx from "../../common/unifaceProCtx";
    import utils from "../../common/utils";
    import type {PageAttrs, PageInitialize} from "@ticatec/uniface-micro-frame/common";
    import CommonPage from "@ticatec/uniface-micro-frame/CommonPage";
    import {useManagedPaging} from "../../common/useManagedPaging.svelte";
    import LoadDataErrorPage from "../../common/LoadDataErrorPage.svelte";
    import type {GetRowFontStyle} from "@ticatec/uniface-element/types";

    interface Props {
        indicatorColumn: IndicatorColumn;
        initializeData?: PageInitialize | null;
        columns: Array<DataColumn>;
        actionsColumn?: ActionsColumn;
        selectedRows?: Array<any>;
        list?: Array<any>;
        dataManager: IPagedDataManager;
        criteria?: any;
        rowHeight?: number;
        getRowFontStyle?: GetRowFontStyle;
        busyIndicator?: string | null;
        page$attrs: PageAttrs;
        roundTable?: boolean;
        canBeClosed?: boolean;
        actions: ButtonActions;
        advancedTitle?: string;
        emptyText?: string;
        sidebar?: Snippet;
        searchPanel?: Snippet;
        advancedPanel?: Snippet;
        onError?: (ex: any) => void;
    }

    let {
        indicatorColumn,
        initializeData = null,
        columns,
        actionsColumn = null as unknown as ActionsColumn,
        selectedRows = $bindable([]),
        list = $bindable([]),
        dataManager,
        criteria = $bindable(),
        rowHeight = undefined,
        getRowFontStyle = undefined,
        busyIndicator = null,
        page$attrs,
        roundTable = false,
        canBeClosed = false,
        actions,
        advancedTitle = undefined,
        emptyText = undefined,
        sidebar,
        searchPanel,
        advancedPanel: advancedPanelContent,
        onError = undefined
    }: Props = $props();

    let pageCount: number = $state(0);
    let pageNo: number = $state(1);
    let total: number = $state(0);

    const managed = useManagedPaging({
        dataManager: () => dataManager,
        initializeData: () => initializeData,
        busyIndicator: () => busyIndicator,
        defaultBusyText: i18nRes.app.busyIndicator(),
        criteria: () => criteria,
        onError: () => onError,
        onResult: (result) => {
            list = result.list;
            total = result.total;
            pageNo = result.pageNo;
            pageCount = result.pageCount;
            criteria = result.criteria;
        }
    });

    export function doSearch(reset: boolean = false) {
        return managed.doSearch(reset);
    }

    /**
     * 按当前条件和当前页码刷新（不回第一页），适用于增删改之后的数据刷新
     */
    export function refresh() {
        return managed.refresh();
    }

    const {onPageChange, onRowCountChanged} = managed;

    onMount(() => managed.initialize());

</script>
{#if managed.loaded}
    <CommonPage {page$attrs} {canBeClosed} content$style=" padding: 0 12px; box-sizing: border-box" {sidebar}>
        {#if managed.error}
            <LoadDataErrorPage message={managed.error} onRetry={() => managed.initialize()}/>
        {:else }
            <DataTableBoard {list} {rowHeight} {indicatorColumn} {columns} {actionsColumn} {roundTable} bind:selectedRows {getRowFontStyle}
                            {emptyText}>
                {#snippet header()}
                    <FilterPanel {actions} onreset={()=>doSearch(true)} onsearch={()=>doSearch()}
                                 advancedTitle={advancedTitle} showAdvancedButton={!!advancedPanelContent}>
                        {@render searchPanel?.()}
                        {#snippet advancedPanel()}
                            {@render advancedPanelContent?.()}
                        {/snippet}
                    </FilterPanel>
                {/snippet}
                {#snippet footer()}
                    <div style="width: 100%; padding: 8px 12px; box-sizing: border-box; flex: 0 0 auto; border-top: 1px solid var(--uniface-page-divid-color, #F0F0F0)">
                        <PaginationPanel rowsSet={unifaceProCtx.rowsSet} {pageCount} {pageNo} {total} onPageSizeChange={onRowCountChanged} onchange={onPageChange}
                                         generateInfo={utils.generateInfo} rowCountText={i18nRes.app.rowCountLabel()}/>
                    </div>
                {/snippet}
            </DataTableBoard>
        {/if}
    </CommonPage>
{/if}
