nntc-ui 0.0.84 → 0.0.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/index.css +13 -0
  2. package/index.d.ts +3 -1
  3. package/index.js +107 -13
  4. package/package.json +1 -1
package/index.css CHANGED
@@ -1900,10 +1900,20 @@
1900
1900
  border-bottom: 1px solid var(--border-color);
1901
1901
  }
1902
1902
  .virtualTable_td {
1903
+ position: relative;
1903
1904
  display: flex;
1904
1905
  align-items: center;
1905
1906
  padding: 0;
1906
1907
  }
1908
+ .virtualTable_rowspanContent {
1909
+ position: absolute;
1910
+ top: 0;
1911
+ left: 0;
1912
+ z-index: 3;
1913
+ display: flex;
1914
+ align-items: center;
1915
+ width: 100%;
1916
+ }
1907
1917
  .virtualTable_root.virtualTable_bordersAll .virtualTable_td:nth-child(2),
1908
1918
  .virtualTable_root.virtualTable_root.virtualTable_bordersVertical .virtualTable_td:nth-child(2) {
1909
1919
  border-left: 1px solid var(--border-color);
@@ -2058,6 +2068,9 @@
2058
2068
  font-size: calc(var(--text-body2-size) - 4px);
2059
2069
  line-height: calc(var(--text-body2-height) - 4px);
2060
2070
  }
2071
+ .virtualTable_input {
2072
+ border-radius: 0 !important;
2073
+ }
2061
2074
 
2062
2075
  /* src/components/view/VirtualTable/ui/HeaderDropdown/headerDropdown.module.css */
2063
2076
  .headerDropdown_root {
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { ButtonHTMLAttributes, ReactNode, DetailedHTMLProps, InputHTMLAttributes, PropsWithChildren, JSX, MutableRefObject, ReactElement, CSSProperties, HTMLProps, ElementType } from 'react';
2
+ import { ButtonHTMLAttributes, ReactNode, DetailedHTMLProps, InputHTMLAttributes, PropsWithChildren, HTMLInputTypeAttribute, JSX, MutableRefObject, ReactElement, CSSProperties, HTMLProps, ElementType } from 'react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { Placement } from '@floating-ui/react';
5
5
 
@@ -280,6 +280,7 @@ interface TableCell {
280
280
  };
281
281
  tooltip?: string;
282
282
  fill?: 'error' | 'success';
283
+ rowspan?: number;
283
284
  }
284
285
 
285
286
  interface TableRow {
@@ -333,6 +334,7 @@ interface TableColumn {
333
334
  }) => void;
334
335
  verticalAlign?: VerticalAlign;
335
336
  toFixed?: number;
337
+ inputType?: HTMLInputTypeAttribute;
336
338
  }
337
339
 
338
340
  interface VirtualTableRef {
package/index.js CHANGED
@@ -1962,7 +1962,7 @@ var Input = forwardRef6(
1962
1962
  {
1963
1963
  ref: mergeRefs5([inputRef, ref]),
1964
1964
  id: inputId,
1965
- className: fileInput,
1965
+ className: classnames8(fileInput, classes?.fileInput),
1966
1966
  type: "file",
1967
1967
  onChange: handleFileChange,
1968
1968
  ...inputProps
@@ -3175,6 +3175,7 @@ __export(virtualTable_exports, {
3175
3175
  error: () => error2,
3176
3176
  evenRow: () => evenRow,
3177
3177
  firstThRow: () => firstThRow,
3178
+ input: () => input8,
3178
3179
  label: () => label7,
3179
3180
  marginLeftChanging: () => marginLeftChanging,
3180
3181
  medium: () => medium12,
@@ -3182,6 +3183,7 @@ __export(virtualTable_exports, {
3182
3183
  rightBorder: () => rightBorder,
3183
3184
  root: () => root17,
3184
3185
  rowButtonTrigger: () => rowButtonTrigger,
3186
+ rowspanContent: () => rowspanContent,
3185
3187
  selected: () => selected3,
3186
3188
  showInModal: () => showInModal,
3187
3189
  small: () => small12,
@@ -3220,6 +3222,7 @@ var alignRight = "virtualTable_alignRight";
3220
3222
  var alignCenter = "virtualTable_alignCenter";
3221
3223
  var tr = "virtualTable_tr";
3222
3224
  var td = "virtualTable_td";
3225
+ var rowspanContent = "virtualTable_rowspanContent";
3223
3226
  var evenRow = "virtualTable_evenRow";
3224
3227
  var selected3 = "virtualTable_selected";
3225
3228
  var sticky = "virtualTable_sticky";
@@ -3240,6 +3243,7 @@ var verticalAlignFlexEnd = "virtualTable_verticalAlignFlexEnd";
3240
3243
  var rowButtonTrigger = "virtualTable_rowButtonTrigger";
3241
3244
  var medium12 = "virtualTable_medium";
3242
3245
  var small12 = "virtualTable_small";
3246
+ var input8 = "virtualTable_input";
3243
3247
  var virtualTable_default = {
3244
3248
  root: root17,
3245
3249
  tableContainer,
@@ -3259,6 +3263,7 @@ var virtualTable_default = {
3259
3263
  alignCenter,
3260
3264
  tr,
3261
3265
  td,
3266
+ rowspanContent,
3262
3267
  evenRow,
3263
3268
  selected: selected3,
3264
3269
  sticky,
@@ -3278,7 +3283,8 @@ var virtualTable_default = {
3278
3283
  verticalAlignFlexEnd,
3279
3284
  rowButtonTrigger,
3280
3285
  medium: medium12,
3281
- small: small12
3286
+ small: small12,
3287
+ input: input8
3282
3288
  };
3283
3289
 
3284
3290
  // src/components/view/VirtualTable/ui/DefaultColumn/DefaultColumn.tsx
@@ -3316,7 +3322,20 @@ var DefaultColumn = {
3316
3322
  {
3317
3323
  label: original[id]?.tooltip ?? "",
3318
3324
  alertType: original[id]?.fill === "error" ? "error" : original[id]?.fill === "success" ? "success" : "default",
3319
- children: additionalViewResult?.edit !== null && additionalViewResult?.edit !== void 0 ? additionalViewResult.edit(onChange, onBlur) : /* @__PURE__ */ jsx31(Fragment6, { children: /* @__PURE__ */ jsx31("input", { onChange: (e) => onChange(e.target.value), onBlur, value: value ?? "", autoFocus: true }) })
3325
+ children: additionalViewResult?.edit !== null && additionalViewResult?.edit !== void 0 ? additionalViewResult.edit(onChange, onBlur) : /* @__PURE__ */ jsx31(Fragment6, { children: /* @__PURE__ */ jsx31(
3326
+ Input,
3327
+ {
3328
+ classes: { input: input8 },
3329
+ componentSize: "small",
3330
+ variant: "outlined",
3331
+ onChange: (e) => onChange(e.target.value),
3332
+ onBlur,
3333
+ value: value ?? "",
3334
+ type: meta.inputType,
3335
+ fullWidth: true,
3336
+ autoFocus: true
3337
+ }
3338
+ ) })
3320
3339
  }
3321
3340
  );
3322
3341
  }
@@ -3453,7 +3472,7 @@ import { useCallback as useCallback11, useState as useState15 } from "react";
3453
3472
  var root20 = "numberFiltration_root";
3454
3473
  var select = "numberFiltration_select";
3455
3474
  var inputsContainer = "numberFiltration_inputsContainer";
3456
- var input8 = "numberFiltration_input";
3475
+ var input9 = "numberFiltration_input";
3457
3476
 
3458
3477
  // src/components/view/VirtualTable/ui/NumberFiltration/NumberFiltration.tsx
3459
3478
  import { Fragment as Fragment7, jsx as jsx33, jsxs as jsxs18 } from "react/jsx-runtime";
@@ -3521,7 +3540,7 @@ function NumberFiltration(props) {
3521
3540
  componentSize: "small",
3522
3541
  variant: "outlined",
3523
3542
  type: "number",
3524
- classes: { root: input8 },
3543
+ classes: { root: input9 },
3525
3544
  value: values[0] > -Infinity && values[0] < Infinity ? values[0] : "",
3526
3545
  onChange: (e) => {
3527
3546
  handleChangeNumber("more", e.target.value);
@@ -3541,7 +3560,7 @@ function NumberFiltration(props) {
3541
3560
  componentSize: "small",
3542
3561
  variant: "outlined",
3543
3562
  type: "number",
3544
- classes: { root: input8 },
3563
+ classes: { root: input9 },
3545
3564
  value: values[1] > -Infinity && values[1] < Infinity ? values[1] : "",
3546
3565
  onChange: (e) => {
3547
3566
  handleChangeNumber("less", e.target.value);
@@ -3561,7 +3580,7 @@ function NumberFiltration(props) {
3561
3580
  componentSize: "small",
3562
3581
  variant: "outlined",
3563
3582
  type: "number",
3564
- classes: { root: input8 },
3583
+ classes: { root: input9 },
3565
3584
  value: selectedItem.value === "more" ? values[0] > -Infinity && values[0] < Infinity ? values[0] : "" : values[1] > -Infinity && values[1] < Infinity ? values[1] : "",
3566
3585
  onChange: (e) => {
3567
3586
  handleChangeNumber(selectedItem.value, e.target.value);
@@ -3817,7 +3836,8 @@ var createMeta = (column) => {
3817
3836
  onClick: column.onClick,
3818
3837
  label: column.label,
3819
3838
  verticalAlign: column.verticalAlign,
3820
- toFixed: column.toFixed
3839
+ toFixed: column.toFixed,
3840
+ inputType: column.inputType
3821
3841
  };
3822
3842
  }
3823
3843
  };
@@ -4107,6 +4127,65 @@ var VirtualTable = forwardRef10((props, ref) => {
4107
4127
  const virtualRows = rowVirtualizer.getVirtualItems();
4108
4128
  const virtualColumns = columnVirtualizer.getVirtualItems();
4109
4129
  const lastVirtualColumnIndex = virtualColumns[virtualColumns.length - 1]?.index;
4130
+ const virtualRowsSizeByIndex = useMemo9(
4131
+ () => new Map(virtualRows.map((item3) => [item3.index, item3.size])),
4132
+ [virtualRows]
4133
+ );
4134
+ const getRowSizeByIndex = useCallback12(
4135
+ (index) => virtualRowsSizeByIndex.get(index) ?? bodyRowHeight,
4136
+ [bodyRowHeight, virtualRowsSizeByIndex]
4137
+ );
4138
+ const getRowspanHeight = useCallback12(
4139
+ (rowIndex, rowspan) => {
4140
+ const clampedRowspan = Math.max(1, Math.floor(rowspan));
4141
+ const lastRowIndex = Math.min(rowsFromTable.length - 1, rowIndex + clampedRowspan - 1);
4142
+ const rowsInRange = lastRowIndex - rowIndex + 1;
4143
+ let result = 0;
4144
+ for (let index = rowIndex; index <= lastRowIndex; index += 1) {
4145
+ result += getRowSizeByIndex(index);
4146
+ }
4147
+ const bordersCompensation = borders === "all" || borders === "horizontal" ? Math.max(0, rowsInRange - 1) : 0;
4148
+ return Math.max(0, result - bordersCompensation);
4149
+ },
4150
+ [borders, getRowSizeByIndex, rowsFromTable.length]
4151
+ );
4152
+ const isCellCoveredByRowspan = useCallback12(
4153
+ (rowIndex, columnId) => {
4154
+ for (let index = rowIndex - 1; index >= 0; index -= 1) {
4155
+ const upperCell = rowsFromTable[index]?.original?.[columnId];
4156
+ const upperRowspan = Math.max(1, upperCell?.rowspan ?? 1);
4157
+ if (index + upperRowspan - 1 >= rowIndex) {
4158
+ return true;
4159
+ }
4160
+ }
4161
+ return false;
4162
+ },
4163
+ [rowsFromTable]
4164
+ );
4165
+ const getRowBackgroundColor = useCallback12((row, rowIndex) => {
4166
+ if (row?.isNew?.value === 1) {
4167
+ return "var(--theme-table-selected-row)";
4168
+ }
4169
+ return rowIndex % 2 !== 0 ? "var(--theme-table-even-row)" : "var(--theme-table-background)";
4170
+ }, []);
4171
+ const rowZIndexByIndex = useMemo9(() => {
4172
+ const rowsCount = rowsFromTable.length;
4173
+ const result = /* @__PURE__ */ new Map();
4174
+ rowsFromTable.forEach((row, rowIndex) => {
4175
+ const maxRowspan = row.getAllCells().reduce(
4176
+ (maxSpan, cell2) => Math.max(maxSpan, Math.max(1, row.original?.[cell2.column.id]?.rowspan ?? 1)),
4177
+ 1
4178
+ );
4179
+ const spanWeight = maxRowspan - 1;
4180
+ const zIndex = spanWeight * (rowsCount + 1) + (rowsCount - rowIndex + 1);
4181
+ result.set(rowIndex, zIndex);
4182
+ });
4183
+ return result;
4184
+ }, [rowsFromTable]);
4185
+ const headerBaseZIndex = useMemo9(
4186
+ () => rowsFromTable.length * rowsFromTable.length + rowsFromTable.length + 10,
4187
+ [rowsFromTable.length]
4188
+ );
4110
4189
  const renderHeaderNode = (header2) => {
4111
4190
  const metaLabel = header2.column.columnDef.meta?.label;
4112
4191
  if (typeof metaLabel === "string") {
@@ -4155,7 +4234,7 @@ var VirtualTable = forwardRef10((props, ref) => {
4155
4234
  style: {
4156
4235
  position: "sticky",
4157
4236
  top: 0,
4158
- zIndex: 2
4237
+ zIndex: headerBaseZIndex
4159
4238
  },
4160
4239
  children: headerGroups.map((headerGroup, hgi) => {
4161
4240
  const innerCell = (header2) => {
@@ -4222,7 +4301,7 @@ var VirtualTable = forwardRef10((props, ref) => {
4222
4301
  marginLeftChanging
4223
4302
  ),
4224
4303
  style: {
4225
- zIndex: 3,
4304
+ zIndex: headerBaseZIndex + 1,
4226
4305
  width: `${columnsEstimateSize(index)}px`,
4227
4306
  height: `${headerGroupHeight[hgi]}px`,
4228
4307
  transform: `translateX(${Array.from({ length: index }, (_, i) => columnsEstimateSize(i)).reduce(
@@ -4250,7 +4329,7 @@ var VirtualTable = forwardRef10((props, ref) => {
4250
4329
  (sum, current) => sum + (current.column.columnDef.meta?.width ?? 0),
4251
4330
  0
4252
4331
  );
4253
- const zIndex = !nextHorizontalHeaders.length && !prevHorizontalHeaders.length ? void 0 : nextHorizontalHeaders.length + 2;
4332
+ const zIndex = !nextHorizontalHeaders.length && !prevHorizontalHeaders.length ? void 0 : headerBaseZIndex + nextHorizontalHeaders.length + 2;
4254
4333
  const thHeight = !prevVerticalHeaders.length ? headerGroupHeight[hgi] : headerGroupHeight[hgi] + prevVerticalHeaders.reduce(
4255
4334
  (sum, _, index) => sum + (headerGroupHeight[hgi - index - 1] ?? 0),
4256
4335
  0
@@ -4311,6 +4390,7 @@ var VirtualTable = forwardRef10((props, ref) => {
4311
4390
  row.original?.isNew?.value === 1 && selected3
4312
4391
  ),
4313
4392
  style: {
4393
+ zIndex: rowZIndexByIndex.get(virtualRow.index) ?? 1,
4314
4394
  ...!dynamicRowHeight && {
4315
4395
  height: virtualRow.size
4316
4396
  },
@@ -4321,6 +4401,10 @@ var VirtualTable = forwardRef10((props, ref) => {
4321
4401
  virtualColumns.map((virtualCol) => {
4322
4402
  const cell2 = row.getAllCells()[virtualCol.index];
4323
4403
  const isSticky = cell2.column.getIsPinned() === "left";
4404
+ const currentCell = row.original?.[cell2.column.id];
4405
+ const rowspan = Math.max(1, currentCell?.rowspan ?? 1);
4406
+ const isCoveredByRowspan = isCellCoveredByRowspan(virtualRow.index, cell2.column.id);
4407
+ const hasRowspan = rowspan > 1 && !isCoveredByRowspan;
4324
4408
  return /* @__PURE__ */ jsx35(
4325
4409
  "div",
4326
4410
  {
@@ -4333,12 +4417,22 @@ var VirtualTable = forwardRef10((props, ref) => {
4333
4417
  // чтобы появился левый бордер
4334
4418
  },
4335
4419
  width: `${virtualCol.size}px`,
4336
- ...!dynamicRowHeight && {
4420
+ ...!dynamicRowHeight && !hasRowspan && {
4337
4421
  overflow: "hidden"
4338
4422
  }
4339
4423
  },
4340
4424
  "data-index": virtualRow.index,
4341
- children: flexRender(cell2.column.columnDef.cell, cell2.getContext())
4425
+ children: !isCoveredByRowspan && (hasRowspan ? /* @__PURE__ */ jsx35(
4426
+ "div",
4427
+ {
4428
+ className: rowspanContent,
4429
+ style: {
4430
+ height: `${getRowspanHeight(virtualRow.index, rowspan)}px`,
4431
+ backgroundColor: getRowBackgroundColor(row.original, virtualRow.index)
4432
+ },
4433
+ children: flexRender(cell2.column.columnDef.cell, cell2.getContext())
4434
+ }
4435
+ ) : flexRender(cell2.column.columnDef.cell, cell2.getContext()))
4342
4436
  },
4343
4437
  `cell-${virtualRow.key}-${virtualCol.key}`
4344
4438
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nntc-ui",
3
- "version": "0.0.84",
3
+ "version": "0.0.85",
4
4
  "author": "NNTC",
5
5
  "description": "React UI-kit for NNTC",
6
6
  "type": "module",