ЦИТК-1036 - Добавление пагинатора для P8PDataGrid

This commit is contained in:
Dollerino 2026-03-27 12:28:58 +03:00
parent b24c3c5689
commit 9c77e5ce05
6 changed files with 285 additions and 12 deletions

View File

@ -1390,6 +1390,10 @@ const MyPanel = () => {
`groups` - необязательный, массив групп данных, содержит объекты вида `{name: <ИМЯ_ГРУППЫ>, caption: <ЗАГОЛОВОКРУППЫ>, expandable: <ПРИЗНАК_РАЗВОРАЧИВАЕМОСТИ_ГРУППЫ - true|false>, expanded: <ПРИЗНАК_РАЗВЕРНУТОСТИ_ГРУППЫ - true|false>}`\ `groups` - необязательный, массив групп данных, содержит объекты вида `{name: <ИМЯ_ГРУППЫ>, caption: <ЗАГОЛОВОКРУППЫ>, expandable: <ПРИЗНАК_РАЗВОРАЧИВАЕМОСТИ_ГРУППЫ - true|false>, expanded: <ПРИЗНАК_РАЗВЕРНУТОСТИ_ГРУППЫ - true|false>}`\
`rows` - необязательный, массив, отображаемые таблицой строки данных, содержит объекты вида `{groupName: <ИМЯ_ГРУППЫ_СОДЕРЖАЩЕЙ_СТРОКУ>, <ИМЯ_КОЛОНКИ>: <ЗНАЧЕНИЕ>}`\ `rows` - необязательный, массив, отображаемые таблицой строки данных, содержит объекты вида `{groupName: <ИМЯ_ГРУППЫ_СОДЕРЖАЩЕЙ_СТРОКУ>, <ИМЯ_КОЛОНКИ>: <ЗНАЧЕНИЕ>}`\
`size` - необязательный, строка, размер отступов при вёрстке таблицы, `small|medium` (см. константу `P8P_DATA_GRID_SIZE` в исходном коде компонента)\ `size` - необязательный, строка, размер отступов при вёрстке таблицы, `small|medium` (см. константу `P8P_DATA_GRID_SIZE` в исходном коде компонента)\
`pageNumber` - необязательный, число, номер отображаемой страницы таблицы, по умолчанию - 1\
`pagesCount` - необязательный, число, количество страниц таблицы, по умолчанию - 0. При значении > 0, параметр `morePages` игнорируется, а у таблицы появляется область отображения страниц (исходя из параметров `pagesAlign` и `pagesPosition`)\
`pagesAlign` - необязательный, строка, размещение области страниц по вертикали, по умолчанию `right`, поддерживает значения `left|right|center` (см. константу `P8P_DATA_GRID_PAGINATOR_ALIGN` в исходном коде компонента)\
`pagesPosition` - необязательный, строка, размещение области страниц по горизонтали, по умолчанию `bottom`, поддерживает значения `top|bottom|both` (см. константу `P8P_DATA_GRID_PAGINATOR_POSITION` в исходном коде компонента)\
`fixedHeader` - необязательный, логический, признак фиксации заголовка таблицы, по умолчанию - `false`\ `fixedHeader` - необязательный, логический, признак фиксации заголовка таблицы, по умолчанию - `false`\
`fixedColumns` - необязательный, число, количество фиксированных колонок слева, по умолчанию - 0\ `fixedColumns` - необязательный, число, количество фиксированных колонок слева, по умолчанию - 0\
`morePages` - необязательный, логический, признак отображения кнопки догрузки данных, по умолчанию - `false`\ `morePages` - необязательный, логический, признак отображения кнопки догрузки данных, по умолчанию - `false`\
@ -1417,6 +1421,7 @@ const MyPanel = () => {
`onOrderChanged` - необязательный, функция, будет вызвана при изменении пользователем состояния сортировок таблицы. Сигнатура функции `f({orders})`, результат функции не интерпретируется. В функцию передаётся объект, поле `orders` которого, содержит текущее состояние сортировок таблицы. Объект `orders` - массив, содержащий элементы вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, direction: <ASC|DESC>}`. Функция применяется для инициации обновления данных в таблице.\ `onOrderChanged` - необязательный, функция, будет вызвана при изменении пользователем состояния сортировок таблицы. Сигнатура функции `f({orders})`, результат функции не интерпретируется. В функцию передаётся объект, поле `orders` которого, содержит текущее состояние сортировок таблицы. Объект `orders` - массив, содержащий элементы вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, direction: <ASC|DESC>}`. Функция применяется для инициации обновления данных в таблице.\
`onFilterChanged` - необязательный, функция, будет вызвана при изменении пользователем состояния фильтров таблицы. Сигнатура функции `f({filters})`, результат функции не интерпретируется. В функцию передаётся объект, поле `filters` которого, содержит текущее состояние фильтров таблицы. Объект `filters` - массив, содержащий элементы вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, from: <ЗНАЧЕНИЕ_НАЧАЛА_ДИАПАЗОНА_ОТБОРА>, to: <ЗНАЧЕНИЕ_ОКОНЧАНИЯ_ДИАПАЗОНА_ОТБОРА>}`. Функция применяется для инициации обновления данных в таблице.\ `onFilterChanged` - необязательный, функция, будет вызвана при изменении пользователем состояния фильтров таблицы. Сигнатура функции `f({filters})`, результат функции не интерпретируется. В функцию передаётся объект, поле `filters` которого, содержит текущее состояние фильтров таблицы. Объект `filters` - массив, содержащий элементы вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, from: <ЗНАЧЕНИЕ_НАЧАЛА_ДИАПАЗОНА_ОТБОРА>, to: <ЗНАЧЕНИЕ_ОКОНЧАНИЯ_ДИАПАЗОНА_ОТБОРА>}`. Функция применяется для инициации обновления данных в таблице.\
`onPagesCountChanged` - необязательный, функция, будет вызвана при изменении пользователем количества отображаемых страниц данных таблицы. Сигнатура функции `f()`, результат функции не интерпретируется. Функция применяется для инициации обновления данных в таблице.\ `onPagesCountChanged` - необязательный, функция, будет вызвана при изменении пользователем количества отображаемых страниц данных таблицы. Сигнатура функции `f()`, результат функции не интерпретируется. Функция применяется для инициации обновления данных в таблице.\
`onPageChanged` - необязательный, функция, будет вызвана при изменении пользователем страницы в области отображения страниц (при `pagesCount` > 0). Сигнатура функции `f({page})`, результат функции не интерпретируется. В функцию передается объект, поле `page` которого, содержит номер выбранной страницы. Значение `page` - число. Функция применяется для инициации обновления данных в таблице.
`objectsCopier` - обязательный, функция глубокого копирования объектов (применяется при обслуживании собственного состояния таблицы данных). Сигнатура функции `f(Object)`, должна возвращать глубокую копию объекта. `objectsCopier` - обязательный, функция глубокого копирования объектов (применяется при обслуживании собственного состояния таблицы данных). Сигнатура функции `f(Object)`, должна возвращать глубокую копию объекта.
Некоторые параметры таблицы данных вынесены в свойства компонента `P8PDataGrid` для минимизации его связи с фреймворком и поддержания возможности стороннего использования (например, свойства `orderAscMenuItemCaption`, `okFilterBtnCaption`, `objectsCopier` и т.п.) . Тем не менее, в настройках фреймворка и его окружении уже есть реализации для данных свойств. Например, в "app.text.js" уже содержатся объявления типовых констант для текстов подписей кнопок и пунктов меню, в "app/core/utils.js" реализована элементарная функция глубокого копиования `deepCopyObject`. Поэтому, в "app/config_wrapper.js" для привязки свойств `P8PDataGrid` к контексту фреймворка реализованы специальные декораторы и объекты-шаблоны, облегчающие подключение экземпляра `P8PDataGrid` к панели и снимающие с разработчика необходимость указывать некоторые из перечисленных выше обязательных свойств. В предложенном ниже примере, из модуля "config_wrapper" в панель импортируется объект `P8P_DATA_GRID_CONFIG_PROPS`, который уже содержт преднастроенное описание свойств `orderAscMenuItemCaption`, `orderDescMenuItemCaption`, `filterMenuItemCaption`, `valueFilterCaption`, `valueFromFilterCaption`, `valueToFilterCaption`, `okFilterBtnCaption`, `clearFilterBtnCaption`, `cancelFilterBtnCaption`, `morePagesBtnCaption`, `noDataFoundText` и `objectsCopier`, полученное из окружения фреймворка. Таким образом, прикладной разработчик может не указывать их значения при использовании `P8PDataGrid` (если по каким-то причинам не хочет их переопределить, конечно). Некоторые параметры таблицы данных вынесены в свойства компонента `P8PDataGrid` для минимизации его связи с фреймворком и поддержания возможности стороннего использования (например, свойства `orderAscMenuItemCaption`, `okFilterBtnCaption`, `objectsCopier` и т.п.) . Тем не менее, в настройках фреймворка и его окружении уже есть реализации для данных свойств. Например, в "app.text.js" уже содержатся объявления типовых констант для текстов подписей кнопок и пунктов меню, в "app/core/utils.js" реализована элементарная функция глубокого копиования `deepCopyObject`. Поэтому, в "app/config_wrapper.js" для привязки свойств `P8PDataGrid` к контексту фреймворка реализованы специальные декораторы и объекты-шаблоны, облегчающие подключение экземпляра `P8PDataGrid` к панели и снимающие с разработчика необходимость указывать некоторые из перечисленных выше обязательных свойств. В предложенном ниже примере, из модуля "config_wrapper" в панель импортируется объект `P8P_DATA_GRID_CONFIG_PROPS`, который уже содержт преднастроенное описание свойств `orderAscMenuItemCaption`, `orderDescMenuItemCaption`, `filterMenuItemCaption`, `valueFilterCaption`, `valueFromFilterCaption`, `valueToFilterCaption`, `okFilterBtnCaption`, `clearFilterBtnCaption`, `cancelFilterBtnCaption`, `morePagesBtnCaption`, `noDataFoundText` и `objectsCopier`, полученное из окружения фреймворка. Таким образом, прикладной разработчик может не указывать их значения при использовании `P8PDataGrid` (если по каким-то причинам не хочет их переопределить, конечно).
@ -1440,6 +1445,7 @@ const MyPanel = () => {
Для таблицы данных это (см. детальные описания программных интерфейсов в пакете `PKG_P8PANELS_VISUAL`): Для таблицы данных это (см. детальные описания программных интерфейсов в пакете `PKG_P8PANELS_VISUAL`):
`PKG_P8PANELS_VISUAL.TDG_MAKE` - функция, инициализация таблицы данных, возвращает объект для хранения описания таблицы\ `PKG_P8PANELS_VISUAL.TDG_MAKE` - функция, инициализация таблицы данных, возвращает объект для хранения описания таблицы\
`PKG_P8PANELS_VISUAL.TDG_PAGES_COUNT_SET` - процедура, служит для обновления значения количества отображаемых страниц\
`PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF` - процедура, добавление описания колонки в таблицу, принимает на вход объект с описанием таблицы и параметры, описывающие добавляемую колонку (её имя, заголовок, тип данных, видимость, доступность отбора и сортировки, набор предопределённых значений и т.д.)\ `PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF` - процедура, добавление описания колонки в таблицу, принимает на вход объект с описанием таблицы и параметры, описывающие добавляемую колонку (её имя, заголовок, тип данных, видимость, доступность отбора и сортировки, набор предопределённых значений и т.д.)\
`PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD` - процедура, служит для формирования коллекции предопределённых значений колонки таблицы (подготовленная коллекция передаётся в `RCOL_VALS` вызова `TDG_ADD_COL_DEF`, если необходимо)\ `PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD` - процедура, служит для формирования коллекции предопределённых значений колонки таблицы (подготовленная коллекция передаётся в `RCOL_VALS` вызова `TDG_ADD_COL_DEF`, если необходимо)\
`PKG_P8PANELS_VISUAL.TDG_ADD_GROUP` - процедура, служит для добавления описания группы в таблицу данных, на вход принимает объект для хранения описания таблицы и параметры добавляемой группы\ `PKG_P8PANELS_VISUAL.TDG_ADD_GROUP` - процедура, служит для добавления описания группы в таблицу данных, на вход принимает объект для хранения описания таблицы и параметры добавляемой группы\

View File

@ -9,7 +9,16 @@
import React, { useState, useEffect } from "react"; //Классы React import React, { useState, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { P8PTable, P8P_TABLE_SIZE, P8P_TABLE_DATA_TYPE, P8P_TABLE_FILTER_SHAPE, P8P_TABLE_MORE_HEIGHT, P8P_TABLE_FILTERS_HEIGHT } from "./p8p_table"; //Таблица import {
P8PTable,
P8P_TABLE_SIZE,
P8P_TABLE_DATA_TYPE,
P8P_TABLE_FILTER_SHAPE,
P8P_TABLE_MORE_HEIGHT,
P8P_TABLE_FILTERS_HEIGHT,
P8P_TABLE_PAGINATOR_ALIGN,
P8P_TABLE_PAGINATOR_POSITION
} from "./p8p_table"; //Таблица
//--------- //---------
//Константы //Константы
@ -30,6 +39,12 @@ const P8P_DATA_GRID_MORE_HEIGHT = P8P_TABLE_MORE_HEIGHT;
//Высота фильтров таблицы //Высота фильтров таблицы
const P8P_DATA_GRID_FILTERS_HEIGHT = P8P_TABLE_FILTERS_HEIGHT; const P8P_DATA_GRID_FILTERS_HEIGHT = P8P_TABLE_FILTERS_HEIGHT;
//Размещение области страниц по вертикали
const P8P_DATA_GRID_PAGINATOR_ALIGN = P8P_TABLE_PAGINATOR_ALIGN;
//Размещение области страниц по горизонтали
const P8P_DATA_GRID_PAGINATOR_POSITION = P8P_TABLE_PAGINATOR_POSITION;
//----------- //-----------
//Тело модуля //Тело модуля
//----------- //-----------
@ -43,6 +58,10 @@ const P8PDataGrid = ({
groups = [], groups = [],
rows = [], rows = [],
size, size,
pageNumber = 1,
pagesCount = 0,
pagesAlign = P8P_DATA_GRID_PAGINATOR_ALIGN.RIGHT,
pagesPosition = P8P_DATA_GRID_PAGINATOR_POSITION.BOTTOM,
fixedHeader = false, fixedHeader = false,
fixedColumns = 0, fixedColumns = 0,
morePages = false, morePages = false,
@ -70,6 +89,7 @@ const P8PDataGrid = ({
onOrderChanged, onOrderChanged,
onFilterChanged, onFilterChanged,
onPagesCountChanged, onPagesCountChanged,
onPageChanged,
objectsCopier objectsCopier
}) => { }) => {
//Собственное состояние - сортировки //Собственное состояние - сортировки
@ -108,6 +128,9 @@ const P8PDataGrid = ({
if (onPagesCountChanged) onPagesCountChanged(); if (onPagesCountChanged) onPagesCountChanged();
}; };
//При изменении номера страницы
const handlePageChange = ({ page }) => onPageChanged && onPageChanged({ page });
//При изменении списка установленных извне фильтров //При изменении списка установленных извне фильтров
useEffect(() => { useEffect(() => {
setFilters(filtersInitial || []); setFilters(filtersInitial || []);
@ -124,6 +147,10 @@ const P8PDataGrid = ({
orders={orders} orders={orders}
filters={filters} filters={filters}
size={size || P8P_DATA_GRID_SIZE.MEDIUM} size={size || P8P_DATA_GRID_SIZE.MEDIUM}
pageNumber={pageNumber}
pagesCount={pagesCount}
pagesAlign={pagesAlign}
pagesPosition={pagesPosition}
fixedHeader={fixedHeader} fixedHeader={fixedHeader}
fixedColumns={fixedColumns} fixedColumns={fixedColumns}
morePages={morePages} morePages={morePages}
@ -152,6 +179,7 @@ const P8PDataGrid = ({
onOrderChanged={handleOrderChanged} onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged} onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged} onPagesCountChanged={handlePagesCountChanged}
onPageChanged={handlePageChange}
/> />
); );
}; };
@ -165,6 +193,10 @@ P8PDataGrid.propTypes = {
groups: PropTypes.array, groups: PropTypes.array,
rows: PropTypes.array, rows: PropTypes.array,
size: PropTypes.string, size: PropTypes.string,
pageNumber: PropTypes.number,
pagesCount: PropTypes.number,
pagesAlign: PropTypes.string,
pagesPosition: PropTypes.string,
fixedHeader: PropTypes.bool, fixedHeader: PropTypes.bool,
fixedColumns: PropTypes.number, fixedColumns: PropTypes.number,
morePages: PropTypes.bool, morePages: PropTypes.bool,
@ -192,6 +224,7 @@ P8PDataGrid.propTypes = {
onOrderChanged: PropTypes.func, onOrderChanged: PropTypes.func,
onFilterChanged: PropTypes.func, onFilterChanged: PropTypes.func,
onPagesCountChanged: PropTypes.func, onPagesCountChanged: PropTypes.func,
onPageChanged: PropTypes.func,
objectsCopier: PropTypes.func.isRequired objectsCopier: PropTypes.func.isRequired
}; };
@ -205,5 +238,7 @@ export {
P8P_DATA_GRID_FILTER_SHAPE, P8P_DATA_GRID_FILTER_SHAPE,
P8P_DATA_GRID_MORE_HEIGHT, P8P_DATA_GRID_MORE_HEIGHT,
P8P_DATA_GRID_FILTERS_HEIGHT, P8P_DATA_GRID_FILTERS_HEIGHT,
P8P_DATA_GRID_PAGINATOR_ALIGN,
P8P_DATA_GRID_PAGINATOR_POSITION,
P8PDataGrid P8PDataGrid
}; };

View File

@ -16,6 +16,7 @@ import {
TableContainer, TableContainer,
TableHead, TableHead,
TableRow, TableRow,
Pagination,
Paper, Paper,
IconButton, IconButton,
Icon, Icon,
@ -81,6 +82,20 @@ const P8P_TABLE_FILTER_SHAPE = PropTypes.shape({
to: PropTypes.any to: PropTypes.any
}); });
//Размещение области страниц по вертикали
const P8P_TABLE_PAGINATOR_ALIGN = {
LEFT: "left",
RIGHT: "right",
CENTER: "center"
};
//Размещение области страниц по горизонтали
const P8P_TABLE_PAGINATOR_POSITION = {
TOP: "top",
BOTTOM: "bottom",
BOTH: "both"
};
//Высота кнопки догрузки данных //Высота кнопки догрузки данных
const P8P_TABLE_MORE_HEIGHT = "49px"; const P8P_TABLE_MORE_HEIGHT = "49px";
@ -136,6 +151,16 @@ const STYLES = {
FILTER_CHIP: { FILTER_CHIP: {
alignItems: "center" alignItems: "center"
}, },
PAGINATION: (pagesAlign, position) => ({
display: "flex",
justifyContent:
pagesAlign === P8P_TABLE_PAGINATOR_ALIGN.LEFT
? "flex-start"
: pagesAlign === P8P_TABLE_PAGINATOR_ALIGN.CENTER
? "space-around"
: "flex-end",
...(position === P8P_TABLE_PAGINATOR_POSITION.TOP ? { paddingBottom: "10px" } : { paddingTop: "10px" })
}),
MORE_BUTTON_CONTAINER: { MORE_BUTTON_CONTAINER: {
with: "100%", with: "100%",
textAlign: "center", textAlign: "center",
@ -472,6 +497,10 @@ const P8PTable = ({
orders, orders,
filters, filters,
size, size,
pageNumber = 1,
pagesCount = 0,
pagesAlign = P8P_TABLE_PAGINATOR_ALIGN.RIGHT,
pagesPosition = P8P_TABLE_PAGINATOR_POSITION.BOTTOM,
fixedHeader = false, fixedHeader = false,
fixedColumns = 0, fixedColumns = 0,
morePages = false, morePages = false,
@ -497,6 +526,7 @@ const P8PTable = ({
onOrderChanged, onOrderChanged,
onFilterChanged, onFilterChanged,
onPagesCountChanged, onPagesCountChanged,
onPageChanged,
objectsCopier, objectsCopier,
containerComponent, containerComponent,
containerComponentProps containerComponentProps
@ -634,6 +664,9 @@ const P8PTable = ({
else setExpanded(pv => ({ ...pv, [rowIndex]: true })); else setExpanded(pv => ({ ...pv, [rowIndex]: true }));
}; };
//Отработка изменения страницы
const handlePageChange = (e, page) => onPageChanged && onPageChanged({ page });
//При перезагрузке данных //При перезагрузке данных
useEffect(() => { useEffect(() => {
if (reloading) setExpanded({}); if (reloading) setExpanded({});
@ -678,6 +711,31 @@ const P8PTable = ({
)); ));
}; };
//Генерация области страниц
const renderPagination = position => {
//Признак отображения в конкретной области
const isVisible = [
position === P8P_TABLE_PAGINATOR_POSITION.TOP ? P8P_TABLE_PAGINATOR_POSITION.TOP : P8P_TABLE_PAGINATOR_POSITION.BOTTOM,
P8P_TABLE_PAGINATOR_POSITION.BOTH
].includes(pagesPosition);
//Генерация содержимого
return (
<>
{pagesCount && pagesCount > 0 && isVisible ? (
<Pagination
sx={STYLES.PAGINATION(pagesAlign, position)}
count={pagesCount}
defaultPage={1}
page={pageNumber}
size="medium"
onChange={handlePageChange}
/>
) : null}
</>
);
};
//Генерация содержимого //Генерация содержимого
return ( return (
<div style={{ ...(style || {}) }}> <div style={{ ...(style || {}) }}>
@ -710,6 +768,7 @@ const P8PTable = ({
valueFormatter={valueFormatter} valueFormatter={valueFormatter}
/> />
) : null} ) : null}
{renderPagination(P8P_TABLE_PAGINATOR_POSITION.TOP)}
<TableContainer component={containerComponent ? containerComponent : Paper} {...(containerComponentProps ? containerComponentProps : {})}> <TableContainer component={containerComponent ? containerComponent : Paper} {...(containerComponentProps ? containerComponentProps : {})}>
<Table stickyHeader={fixedHeader} sx={{ ...STYLES.TABLE, ...(tableStyle || {}) }} size={size || P8P_TABLE_SIZE.MEDIUM}> <Table stickyHeader={fixedHeader} sx={{ ...STYLES.TABLE, ...(tableStyle || {}) }} size={size || P8P_TABLE_SIZE.MEDIUM}>
<TableHead sx={fixedHeader ? STYLES.TABLE_HEAD_STICKY : {}}> <TableHead sx={fixedHeader ? STYLES.TABLE_HEAD_STICKY : {}}>
@ -863,7 +922,8 @@ const P8PTable = ({
</TableBody> </TableBody>
</Table> </Table>
</TableContainer> </TableContainer>
{morePages ? ( {renderPagination(P8P_TABLE_PAGINATOR_POSITION.BOTTOM)}
{morePages && (!pagesCount || pagesCount <= 0) ? (
<Container style={STYLES.MORE_BUTTON_CONTAINER}> <Container style={STYLES.MORE_BUTTON_CONTAINER}>
<Button fullWidth onClick={handleMorePagesBtnClick} {...(morePagesBtnProps ? morePagesBtnProps : {})}> <Button fullWidth onClick={handleMorePagesBtnClick} {...(morePagesBtnProps ? morePagesBtnProps : {})}>
{morePagesBtnCaption} {morePagesBtnCaption}
@ -910,6 +970,10 @@ P8PTable.propTypes = {
).isRequired, ).isRequired,
filters: PropTypes.arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired, filters: PropTypes.arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,
size: PropTypes.string, size: PropTypes.string,
pageNumber: PropTypes.number,
pagesCount: PropTypes.number,
pagesAlign: PropTypes.string,
pagesPosition: PropTypes.string,
fixedHeader: PropTypes.bool, fixedHeader: PropTypes.bool,
fixedColumns: PropTypes.number, fixedColumns: PropTypes.number,
morePages: PropTypes.bool, morePages: PropTypes.bool,
@ -935,6 +999,7 @@ P8PTable.propTypes = {
onOrderChanged: PropTypes.func, onOrderChanged: PropTypes.func,
onFilterChanged: PropTypes.func, onFilterChanged: PropTypes.func,
onPagesCountChanged: PropTypes.func, onPagesCountChanged: PropTypes.func,
onPageChanged: PropTypes.func,
objectsCopier: PropTypes.func.isRequired, objectsCopier: PropTypes.func.isRequired,
containerComponent: PropTypes.oneOfType([PropTypes.elementType, PropTypes.string]), containerComponent: PropTypes.oneOfType([PropTypes.elementType, PropTypes.string]),
containerComponentProps: PropTypes.object containerComponentProps: PropTypes.object
@ -944,4 +1009,13 @@ P8PTable.propTypes = {
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { P8P_TABLE_DATA_TYPE, P8P_TABLE_SIZE, P8P_TABLE_FILTER_SHAPE, P8P_TABLE_MORE_HEIGHT, P8P_TABLE_FILTERS_HEIGHT, P8PTable }; export {
P8P_TABLE_DATA_TYPE,
P8P_TABLE_SIZE,
P8P_TABLE_FILTER_SHAPE,
P8P_TABLE_MORE_HEIGHT,
P8P_TABLE_FILTERS_HEIGHT,
P8P_TABLE_PAGINATOR_ALIGN,
P8P_TABLE_PAGINATOR_POSITION,
P8PTable
};

View File

@ -121,15 +121,18 @@ const DataGrid = ({ title }) => {
...pv, ...pv,
...data.XDATA_GRID, ...data.XDATA_GRID,
columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [], columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [],
rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])], rows:
data.XDATA_GRID.pagesCount > 0 || pv.pageNumber == 1
? [...(data.XDATA_GRID.rows || [])]
: [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])],
groups: data.XDATA_GRID.groups groups: data.XDATA_GRID.groups
? pv.pageNumber == 1 ? data.XDATA_GRID.pagesCount > 0 || pv.pageNumber == 1
? [...data.XDATA_GRID.groups] ? [...data.XDATA_GRID.groups]
: [...(pv.groups || []), ...data.XDATA_GRID.groups.filter(g => !pv.groups.find(pg => pg.name == g.name))] : [...(pv.groups || []), ...data.XDATA_GRID.groups.filter(g => !pv.groups.find(pg => pg.name == g.name))]
: [...(pv.groups || [])], : [...(pv.groups || [])],
dataLoaded: true, dataLoaded: true,
reloading: false, reloading: false,
morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE morePages: data.XDATA_GRID.morePages && (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE
})); }));
} }
}, [dataGrid.reloading, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]); }, [dataGrid.reloading, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);
@ -143,6 +146,11 @@ const DataGrid = ({ title }) => {
//При изменении количества отображаемых страниц //При изменении количества отображаемых страниц
const handlePagesCountChanged = () => setDataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reloading: true })); const handlePagesCountChanged = () => setDataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reloading: true }));
//При изменении страницы отображения
const handlePageChange = ({ page }) => {
setDataGrid(pv => ({ ...pv, pageNumber: page, reloading: true }));
};
//При нажатии на копку контрагента //При нажатии на копку контрагента
const handleAgnButtonClicked = agnCode => pOnlineShowDocument({ unitCode: "AGNLIST", document: agnCode, inRnParameter: "in_AGNABBR" }); const handleAgnButtonClicked = agnCode => pOnlineShowDocument({ unitCode: "AGNLIST", document: agnCode, inRnParameter: "in_AGNABBR" });
@ -173,6 +181,7 @@ const DataGrid = ({ title }) => {
onOrderChanged={handleOrderChanged} onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged} onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged} onPagesCountChanged={handlePagesCountChanged}
onPageChanged={handlePageChange}
rowExpandRender={({ row }) => ( rowExpandRender={({ row }) => (
<Button onClick={() => handleAgnButtonClicked(row.SAGNABBR)}>Показать в разделе</Button> <Button onClick={() => handleAgnButtonClicked(row.SAGNABBR)}>Показать в разделе</Button>
)} )}

View File

@ -231,6 +231,8 @@ create or replace package body PKG_P8PANELS_SAMPLES as
SMF_ID => null, SMF_ID => null,
SOKOGU => null, SOKOGU => null,
NJURPERS_SUBDIV => 0, NJURPERS_SUBDIV => 0,
SSFR_ORG => null,
STAX_ORG => null,
NRN => NRN); NRN => NRN);
end AGNLIST_INSERT; end AGNLIST_INSERT;
@ -270,6 +272,75 @@ create or replace package body PKG_P8PANELS_SAMPLES as
SAGNINFO PKG_STD.TSTRING; -- Буфер для "Сведений" SAGNINFO PKG_STD.TSTRING; -- Буфер для "Сведений"
SAGNNAME PKG_STD.TSTRING; -- Буфер для "Наименования" SAGNNAME PKG_STD.TSTRING; -- Буфер для "Наименования"
NAGNTYPE PKG_STD.TREF; -- Буфер для "Типа" NAGNTYPE PKG_STD.TREF; -- Буфер для "Типа"
NPAGES_COUNT PKG_STD.TREF; -- Количество отображаемых страниц
/* Считывание количество страниц таблицы данных */
function PAGES_COUNT_GET
(
NCOMPANY in number, -- Организация сеанса
RDG in PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы
RFILTERS in PKG_P8PANELS_VISUAL.TDG_FILTERS, -- Фильтры
NPAGE_SIZE in number -- Количество записей на странице (0 - все)
) return number -- Количество страниц данных
is
NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора
CSQL clob; -- Буфер для запроса
ICURSOR integer; -- Курсор для исполнения запроса
NRESULT PKG_STD.TLNUMBER; -- Количество страниц данных
begin
/* Обходим данные */
begin
/* Добавляем подсказку совместимости */
CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
/* Формируем запрос */
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select count(AG.RN) NCOUNT');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from AGNLIST AG');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = AG.CRN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR where UR.AUTHID = UTILIZER())');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.AUTHID = UTILIZER())');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT)');
/* Учтём фильтры */
PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY(NIDENT => NIDENT,
NCOMPANY => NCOMPANY,
SUNIT => 'AGNLIST',
SPROCEDURE => 'P_AGNLIST_BASE_COND',
RDATA_GRID => RDG,
RFILTERS => RFILTERS);
/* Разбираем его */
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
/* Делаем подстановку параметров */
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT);
/* Описываем структуру записи курсора */
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
/* Выполняем */
if (PKG_SQL_DML.EXECUTE_AND_FETCH(ICURSOR => ICURSOR, BEXACT => false) = 1) then
/* Считываем количество записей */
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NRESULT);
/* Если данных не найдено */
if (NRESULT = 0) then
/* Оставляем одну страницу */
NRESULT := 1;
else
/* Определяем количество страниц */
NRESULT := CEIL(NRESULT / NPAGE_SIZE);
end if;
end if;
/* Освобождаем курсор */
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
exception
when others then
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
raise;
end;
/* Возвращаем результат */
return NRESULT;
end PAGES_COUNT_GET;
begin begin
/* Читаем фильтры */ /* Читаем фильтры */
RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS); RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS);
@ -281,7 +352,11 @@ create or replace package body PKG_P8PANELS_SAMPLES as
NROW_FROM => NROW_FROM, NROW_FROM => NROW_FROM,
NROW_TO => NROW_TO); NROW_TO => NROW_TO);
/* Инициализируем таблицу данных */ /* Инициализируем таблицу данных */
RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2); RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true,
NFIXED_COLUMNS => 2,
NPAGES_COUNT => 10,
SPAGES_POSITION => PKG_P8PANELS_VISUAL.STABLE_PAGES_POSITION_BOTTOM,
SPAGES_ALIGN => PKG_P8PANELS_VISUAL.STABLE_PAGES_ALIGN_RIGHT);
/* Описываем колонки таблицы данных */ /* Описываем колонки таблицы данных */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SAGNABBR', SNAME => 'SAGNABBR',
@ -440,6 +515,13 @@ create or replace package body PKG_P8PANELS_SAMPLES as
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
raise; raise;
end; end;
/* Определяем количество отображаемых страниц */
NPAGES_COUNT := PAGES_COUNT_GET(NCOMPANY => NCOMPANY, RDG => RDG, RFILTERS => RF, NPAGE_SIZE => NPAGE_SIZE);
/* Если количество страниц определено */
if (NPAGES_COUNT is not null) then
/* Устанавливаем количество отображаемых страниц */
PKG_P8PANELS_VISUAL.TDG_PAGES_COUNT_SET(RDATA_GRID => RDG, NPAGES_COUNT => NPAGES_COUNT);
end if;
/* Сериализуем описание */ /* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end DATA_GRID; end DATA_GRID;

View File

@ -9,6 +9,16 @@ create or replace package PKG_P8PANELS_VISUAL as
SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию
SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию
/* Константы - таблица - расположение области страниц по горизонтали */
STABLE_PAGES_ALIGN_LEFT constant PKG_STD.TSTRING := 'left'; -- Слева
STABLE_PAGES_ALIGN_RIGHT constant PKG_STD.TSTRING := 'right'; -- Справа
STABLE_PAGES_ALIGN_CENTER constant PKG_STD.TSTRING := 'center'; -- По середине
/* Константы - таблица - расположение области страниц по вертикали */
STABLE_PAGES_POSITION_TOP constant PKG_STD.TSTRING := 'top'; -- Наверху
STABLE_PAGES_POSITION_BOTTOM constant PKG_STD.TSTRING := 'bottom'; -- Внизу
STABLE_PAGES_POSITION_BOTH constant PKG_STD.TSTRING := 'both'; -- Наверху и внизу
/* Константы - диаграмма Ганта - масштаб */ /* Константы - диаграмма Ганта - масштаб */
NGANTT_ZOOM_QUARTER_DAY constant PKG_STD.TNUMBER := 0; -- Четверть дня NGANTT_ZOOM_QUARTER_DAY constant PKG_STD.TNUMBER := 0; -- Четверть дня
NGANTT_ZOOM_HALF_DAY constant PKG_STD.TNUMBER := 1; -- Пол дня NGANTT_ZOOM_HALF_DAY constant PKG_STD.TNUMBER := 1; -- Пол дня
@ -122,6 +132,10 @@ create or replace package PKG_P8PANELS_VISUAL as
( (
BFIXED_HEADER boolean, -- Зафиксировать заголовок BFIXED_HEADER boolean, -- Зафиксировать заголовок
NFIXED_COLUMNS PKG_STD.TNUMBER, -- Количество фиксированных колонок NFIXED_COLUMNS PKG_STD.TNUMBER, -- Количество фиксированных колонок
NPAGES_COUNT PKG_STD.TNUMBER, -- Количество страниц
SPAGES_ALIGN PKG_STD.TSTRING, -- Область блока страниц по вертикали (см. константы STABLE_PAGES_ALIGN_*)
SPAGES_POSITION PKG_STD.TSTRING, -- Область блока страниц по горизонтали (см. константы STABLE_PAGES_POSITION_*)
BMORE_PAGES boolean, -- Отображение кнопки догрузки данных (true - отображать, false - не отображать)
RCOL_DEFS TDG_COL_DEFS, -- Описание колонок RCOL_DEFS TDG_COL_DEFS, -- Описание колонок
RGROUPS TDG_GROUPS, -- Описание групп RGROUPS TDG_GROUPS, -- Описание групп
RROWS TDG_ROWS -- Данные строк RROWS TDG_ROWS -- Данные строк
@ -440,9 +454,20 @@ create or replace package PKG_P8PANELS_VISUAL as
function TDG_MAKE function TDG_MAKE
( (
BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок
NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок NFIXED_COLUMNS in number := 0, -- Количество фиксированных колонок
NPAGES_COUNT in number := 0, -- Количество страниц
SPAGES_ALIGN in varchar2 := null, -- Область блока страниц по вертикали (см. константы STABLE_PAGES_ALIGN_*)
SPAGES_POSITION in varchar2 := null, -- Область блока страниц по горизонтали (см. константы STABLE_PAGES_POSITION_*)
BMORE_PAGES in boolean := true -- Отображение кнопки догрузки данных (true - отображать, false - не отображать)
) return TDG; -- Результат работы ) return TDG; -- Результат работы
/* Установка количества страниц таблицы данных */
procedure TDG_PAGES_COUNT_SET
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
NPAGES_COUNT in number -- Количество страниц
);
/* Поиск описания колонки в таблице данных по наименованию */ /* Поиск описания колонки в таблице данных по наименованию */
function TDG_FIND_COL_DEF function TDG_FIND_COL_DEF
( (
@ -839,6 +864,10 @@ create or replace package body PKG_P8PANELS_VISUAL as
SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения
SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка
SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок
SRESP_ATTR_PAGES_COUNT constant PKG_STD.TSTRING := 'pagesCount'; -- Атрибут для количества страниц
SRESP_ATTR_PAGES_ALIGN constant PKG_STD.TSTRING := 'pagesAlign'; -- Атрибут для области блока страниц по вертикали
SRESP_ATTR_PAGES_POSITION constant PKG_STD.TSTRING := 'pagesPosition'; -- Атрибут для области блока страниц по горизонтали
SRESP_ATTR_MORE_PAGES constant PKG_STD.TSTRING := 'morePages'; -- Атрибут для области блока страниц по горизонтали
SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины
SRESP_ATTR_HEIGHT constant PKG_STD.TSTRING := 'height'; -- Атрибут для высоты SRESP_ATTR_HEIGHT constant PKG_STD.TSTRING := 'height'; -- Атрибут для высоты
SRESP_ATTR_COLUMNS constant PKG_STD.TSTRING := 'columns'; -- Атрибут для колонок SRESP_ATTR_COLUMNS constant PKG_STD.TSTRING := 'columns'; -- Атрибут для колонок
@ -1420,7 +1449,11 @@ create or replace package body PKG_P8PANELS_VISUAL as
function TDG_MAKE function TDG_MAKE
( (
BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок
NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок NFIXED_COLUMNS in number := 0, -- Количество фиксированных колонок
NPAGES_COUNT in number := 0, -- Количество страниц
SPAGES_ALIGN in varchar2 := null, -- Область блока страниц по вертикали (см. константы STABLE_PAGES_ALIGN_*)
SPAGES_POSITION in varchar2 := null, -- Область блока страниц по горизонтали (см. константы STABLE_PAGES_POSITION_*)
BMORE_PAGES in boolean := true -- Отображение кнопки догрузки данных (true - отображать, false - не отображать)
) return TDG -- Результат работы ) return TDG -- Результат работы
is is
RRES TDG; -- Буфер для результата RRES TDG; -- Буфер для результата
@ -1428,13 +1461,43 @@ create or replace package body PKG_P8PANELS_VISUAL as
/* Формируем объект */ /* Формируем объект */
RRES.BFIXED_HEADER := COALESCE(BFIXED_HEADER, false); RRES.BFIXED_HEADER := COALESCE(BFIXED_HEADER, false);
RRES.NFIXED_COLUMNS := COALESCE(NFIXED_COLUMNS, 0); RRES.NFIXED_COLUMNS := COALESCE(NFIXED_COLUMNS, 0);
RRES.RCOL_DEFS := TDG_COL_DEFS(); RRES.NPAGES_COUNT := COALESCE(NPAGES_COUNT, 0);
RRES.RGROUPS := TDG_GROUPS(); /* Если указано количество страниц */
RRES.RROWS := TDG_ROWS(); if (RRES.NPAGES_COUNT > 0) then
/* При отображении страниц не отображаем кнопку догрузки данных */
RRES.BMORE_PAGES := false;
/* Предопределяем отображение области страниц параметрами по умолчанию */
RRES.SPAGES_ALIGN := COALESCE(SPAGES_ALIGN, STABLE_PAGES_ALIGN_RIGHT);
RRES.SPAGES_POSITION := COALESCE(SPAGES_POSITION, STABLE_PAGES_POSITION_BOTTOM);
else
RRES.BMORE_PAGES := COALESCE(BMORE_PAGES, true);
RRES.SPAGES_ALIGN := SPAGES_ALIGN;
RRES.SPAGES_POSITION := SPAGES_POSITION;
end if;
RRES.RCOL_DEFS := TDG_COL_DEFS();
RRES.RGROUPS := TDG_GROUPS();
RRES.RROWS := TDG_ROWS();
/* Возвращаем результат */ /* Возвращаем результат */
return RRES; return RRES;
end TDG_MAKE; end TDG_MAKE;
/* Установка количества страниц таблицы данных */
procedure TDG_PAGES_COUNT_SET
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
NPAGES_COUNT in number -- Количество страниц
)
is
begin
/* Обновляем значение количества страниц */
RDATA_GRID.NPAGES_COUNT := COALESCE(NPAGES_COUNT, 0);
/* Если количество страниц меньше или равно нулю */
if (RDATA_GRID.NPAGES_COUNT <= 0) then
/* Обновляем доступность загрузку по кнопке */
RDATA_GRID.BMORE_PAGES := true;
end if;
end TDG_PAGES_COUNT_SET;
/* Поиск описания колонки в таблице данных по наименованию */ /* Поиск описания колонки в таблице данных по наименованию */
function TDG_FIND_COL_DEF function TDG_FIND_COL_DEF
( (
@ -1536,6 +1599,10 @@ create or replace package body PKG_P8PANELS_VISUAL as
/*атические атрибуты заголовка */ /*атические атрибуты заголовка */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_HEADER, BVALUE => RDATA_GRID.BFIXED_HEADER); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_HEADER, BVALUE => RDATA_GRID.BFIXED_HEADER);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_COLUMNS, NVALUE => RDATA_GRID.NFIXED_COLUMNS); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_COLUMNS, NVALUE => RDATA_GRID.NFIXED_COLUMNS);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_PAGES_COUNT, NVALUE => RDATA_GRID.NPAGES_COUNT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_PAGES_ALIGN, SVALUE => RDATA_GRID.SPAGES_ALIGN);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_PAGES_POSITION, SVALUE => RDATA_GRID.SPAGES_POSITION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_MORE_PAGES, BVALUE => RDATA_GRID.BMORE_PAGES);
end TDG_DEF_TO_XML; end TDG_DEF_TO_XML;
/* Сериализация таблицы данных */ /* Сериализация таблицы данных */