snice 7.6.0 → 7.8.0
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.
- package/adapters/react/SniceProvider.js +1 -1
- package/adapters/react/SniceRouter.js +1 -1
- package/adapters/react/calendar.d.ts +1 -0
- package/adapters/react/calendar.d.ts.map +1 -1
- package/adapters/react/calendar.js +1 -1
- package/adapters/react/calendar.js.map +1 -1
- package/adapters/react/calendar.tsx +2 -1
- package/adapters/react/matchRoute.js +1 -1
- package/adapters/react/useRequestHandler.js +1 -1
- package/bin/analyzer-contracts.js +8 -2
- package/custom-elements.json +15 -1
- package/dist/cdn/accordion/snice-accordion.js +1 -1
- package/dist/cdn/action-bar/snice-action-bar.js +1 -1
- package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
- package/dist/cdn/alert/snice-alert.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
- package/dist/cdn/availability/snice-availability.js +1 -1
- package/dist/cdn/avatar/snice-avatar.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
- package/dist/cdn/badge/snice-badge.js +1 -1
- package/dist/cdn/banner/snice-banner.js +1 -1
- package/dist/cdn/binpack/snice-binpack.js +1 -1
- package/dist/cdn/book/snice-book.js +1 -1
- package/dist/cdn/booking/snice-booking.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
- package/dist/cdn/button/snice-button.js +2 -2
- package/dist/cdn/button/snice-button.js.map +1 -1
- package/dist/cdn/button/snice-button.min.js +1 -1
- package/dist/cdn/button/snice-button.min.js.map +1 -1
- package/dist/cdn/calendar/README.md +2 -2
- package/dist/cdn/calendar/snice-calendar.js +26 -2
- package/dist/cdn/calendar/snice-calendar.js.map +1 -1
- package/dist/cdn/calendar/snice-calendar.min.js +2 -2
- package/dist/cdn/calendar/snice-calendar.min.js.map +1 -1
- package/dist/cdn/camera/snice-camera.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.js +1 -1
- package/dist/cdn/card/snice-card.js +1 -1
- package/dist/cdn/carousel/snice-carousel.js +1 -1
- package/dist/cdn/cart/snice-cart.js +1 -1
- package/dist/cdn/chart/snice-chart.js +1 -1
- package/dist/cdn/chat/snice-chat.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.js +1 -1
- package/dist/cdn/chip/snice-chip.js +1 -1
- package/dist/cdn/code-block/snice-code-block.js +1 -1
- package/dist/cdn/color-display/snice-color-display.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.js +1 -1
- package/dist/cdn/comments/snice-comments.js +1 -1
- package/dist/cdn/countdown/snice-countdown.js +1 -1
- package/dist/cdn/cropper/snice-cropper.js +1 -1
- package/dist/cdn/data-card/snice-data-card.js +1 -1
- package/dist/cdn/date-picker/snice-date-picker.js +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
- package/dist/cdn/diff/snice-diff.js +1 -1
- package/dist/cdn/divider/snice-divider.js +1 -1
- package/dist/cdn/doc/snice-doc.js +1 -1
- package/dist/cdn/draw/snice-draw.js +1 -1
- package/dist/cdn/drawer/snice-drawer.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.js +1 -1
- package/dist/cdn/estimate/snice-estimate.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.js +1 -1
- package/dist/cdn/flow/snice-flow.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.js +1 -1
- package/dist/cdn/funnel/snice-funnel.js +1 -1
- package/dist/cdn/gantt/snice-gantt.js +1 -1
- package/dist/cdn/gauge/snice-gauge.js +1 -1
- package/dist/cdn/grid/snice-grid.js +1 -1
- package/dist/cdn/heatmap/snice-heatmap.js +1 -1
- package/dist/cdn/image/snice-image.js +1 -1
- package/dist/cdn/input/snice-input.js +1 -1
- package/dist/cdn/invoice/snice-invoice.js +1 -1
- package/dist/cdn/kanban/snice-kanban.js +1 -1
- package/dist/cdn/key-value/snice-key-value.js +1 -1
- package/dist/cdn/kpi/snice-kpi.js +1 -1
- package/dist/cdn/layout/snice-layout.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
- package/dist/cdn/link/snice-link.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.js +1 -1
- package/dist/cdn/list/snice-list.js +1 -1
- package/dist/cdn/location/snice-location.js +1 -1
- package/dist/cdn/login/README.md +1 -1
- package/dist/cdn/login/snice-login.js +2 -2
- package/dist/cdn/login/snice-login.js.map +1 -1
- package/dist/cdn/login/snice-login.min.js +1 -1
- package/dist/cdn/login/snice-login.min.js.map +1 -1
- package/dist/cdn/map/snice-map.js +1 -1
- package/dist/cdn/markdown/snice-markdown.js +1 -1
- package/dist/cdn/masonry/snice-masonry.js +1 -1
- package/dist/cdn/menu/snice-menu.js +1 -1
- package/dist/cdn/message-strip/snice-message-strip.js +1 -1
- package/dist/cdn/modal/snice-modal.js +1 -1
- package/dist/cdn/music-player/snice-music-player.js +1 -1
- package/dist/cdn/nav/snice-nav.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.js +1 -1
- package/dist/cdn/pagination/snice-pagination.js +1 -1
- package/dist/cdn/paint/snice-paint.js +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
- package/dist/cdn/popover/snice-popover.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
- package/dist/cdn/product-card/snice-product-card.js +1 -1
- package/dist/cdn/progress/snice-progress.js +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
- package/dist/cdn/qr-code/snice-qr-code.js +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
- package/dist/cdn/radio/snice-radio.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.js +1 -1
- package/dist/cdn/rating/snice-rating.js +1 -1
- package/dist/cdn/receipt/snice-receipt.js +1 -1
- package/dist/cdn/recipe/snice-recipe.js +1 -1
- package/dist/cdn/runtime/README.md +2 -2
- package/dist/cdn/runtime/snice-runtime.esm.js +130 -31
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +130 -31
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
- package/dist/cdn/sankey/snice-sankey.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
- package/dist/cdn/select/snice-select.js +1 -1
- package/dist/cdn/skeleton/snice-skeleton.js +1 -1
- package/dist/cdn/slider/snice-slider.js +1 -1
- package/dist/cdn/sortable/snice-sortable.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.js +1 -1
- package/dist/cdn/spinner/snice-spinner.js +1 -1
- package/dist/cdn/split-button/snice-split-button.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.js +1 -1
- package/dist/cdn/step-input/snice-step-input.js +1 -1
- package/dist/cdn/stepper/snice-stepper.js +1 -1
- package/dist/cdn/switch/snice-switch.js +1 -1
- package/dist/cdn/table/README.md +2 -2
- package/dist/cdn/table/snice-table.esm.js +227 -36
- package/dist/cdn/table/snice-table.esm.js.map +1 -1
- package/dist/cdn/table/snice-table.esm.min.js +69 -48
- package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
- package/dist/cdn/table/snice-table.js +226 -35
- package/dist/cdn/table/snice-table.js.map +1 -1
- package/dist/cdn/table/snice-table.min.js +47 -26
- package/dist/cdn/table/snice-table.min.js.map +1 -1
- package/dist/cdn/tabs/snice-tabs.js +1 -1
- package/dist/cdn/tag/snice-tag.js +1 -1
- package/dist/cdn/tag-input/README.md +2 -2
- package/dist/cdn/tag-input/snice-tag-input.js +10 -16
- package/dist/cdn/tag-input/snice-tag-input.js.map +1 -1
- package/dist/cdn/tag-input/snice-tag-input.min.js +2 -2
- package/dist/cdn/tag-input/snice-tag-input.min.js.map +1 -1
- package/dist/cdn/terminal/snice-terminal.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.js +1 -1
- package/dist/cdn/textarea/snice-textarea.js +1 -1
- package/dist/cdn/time-picker/snice-time-picker.js +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
- package/dist/cdn/timeline/snice-timeline.js +1 -1
- package/dist/cdn/timer/snice-timer.js +1 -1
- package/dist/cdn/toast/snice-toast.js +1 -1
- package/dist/cdn/tooltip/snice-tooltip.js +1 -1
- package/dist/cdn/tree/snice-tree.js +1 -1
- package/dist/cdn/treemap/snice-treemap.js +1 -1
- package/dist/cdn/user-card/snice-user-card.js +1 -1
- package/dist/cdn/video-player/snice-video-player.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
- package/dist/cdn/waterfall/snice-waterfall.js +1 -1
- package/dist/cdn/weather/snice-weather.js +1 -1
- package/dist/cdn/work-order/snice-work-order.js +1 -1
- package/dist/components/button/snice-button.js +1 -1
- package/dist/components/button/snice-button.js.map +1 -1
- package/dist/components/calendar/snice-calendar.d.ts +2 -0
- package/dist/components/calendar/snice-calendar.js +25 -1
- package/dist/components/calendar/snice-calendar.js.map +1 -1
- package/dist/components/table/snice-row.d.ts +6 -0
- package/dist/components/table/snice-row.js +11 -3
- package/dist/components/table/snice-row.js.map +1 -1
- package/dist/components/table/snice-table.d.ts +40 -3
- package/dist/components/table/snice-table.js +157 -17
- package/dist/components/table/snice-table.js.map +1 -1
- package/dist/components/table/table-cell-presentation.d.ts +11 -0
- package/dist/components/table/table-cell-presentation.js +25 -8
- package/dist/components/table/table-cell-presentation.js.map +1 -1
- package/dist/components/table/table-export.d.ts +6 -0
- package/dist/components/table/table-export.js +11 -2
- package/dist/components/table/table-export.js.map +1 -1
- package/dist/components/table/table-keyboard.js +1 -1
- package/dist/components/table/table-keyboard.js.map +1 -1
- package/dist/components/table/table-master-detail.d.ts +11 -2
- package/dist/components/table/table-master-detail.js +20 -3
- package/dist/components/table/table-master-detail.js.map +1 -1
- package/dist/components/tag-input/snice-tag-input.d.ts +2 -2
- package/dist/components/tag-input/snice-tag-input.js +9 -15
- package/dist/components/tag-input/snice-tag-input.js.map +1 -1
- package/dist/index.cjs +127 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +127 -28
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +127 -28
- package/dist/index.iife.js.map +1 -1
- package/dist/react/SniceProvider.js +1 -1
- package/dist/react/SniceRouter.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/matchRoute.js +1 -1
- package/dist/react/useRequestHandler.js +1 -1
- package/dist/request-response.d.ts +24 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/testing-dom.cjs +1 -1
- package/dist/testing-dom.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/ai/DEVELOPMENT.md +1 -1
- package/docs/ai/components/calendar.md +8 -0
- package/docs/ai/components/tag-input.md +4 -0
- package/docs/ai/controllers.md +22 -6
- package/docs/components/calendar.md +24 -0
- package/docs/components/tag-input.md +6 -1
- package/docs/controllers.md +57 -6
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snice-row.js","sources":["../../../components/table/snice-row.css?inline","../../../../components/table/snice-row.ts"],"sourcesContent":["export default \":host([hidden]){display:none}:host{display:block;width:100%;min-height:2.5rem}.row-container{display:flex;align-items:stretch;width:100%;min-height:2.5rem;background:0 0;color:var(--snice-color-text,rgb(23 23 23));border-bottom:1px solid var(--snice-color-border,rgb(226 226 226));transition:background-color .15s}.cell{display:flex;align-items:center;border-right:1px solid var(--snice-color-border,rgb(226 226 226));min-height:2.5rem;min-width:6.25rem;flex:1;word-wrap:break-word;overflow:hidden;color:var(--snice-color-text,rgb(23 23 23))}.cell:last-child{border-right:none}.cell--checkbox{width:3rem;min-width:3rem;max-width:3rem;padding:.75rem;justify-content:center}.row-checkbox{width:1rem;height:1rem;cursor:pointer;margin:0;display:block;accent-color:var(--snice-color-primary,rgb(37 99 235))}.cells-container{display:flex;flex:1;align-items:stretch}.cell--text{text-align:left}.cell--accounting,.cell--currency,.cell--fraction,.cell--number,.cell--percent,.cell--scientific{text-align:right;font-variant-numeric:tabular-nums}.cell--date{min-width:8rem;font-variant-numeric:tabular-nums}.cell--boolean{text-align:center;font-size:1rem}.cell--rating{text-align:center;min-width:6rem}.cell--progress{min-width:8rem}.cell--sparkline{text-align:center;min-width:6rem}.cell--duration,.cell--filesize{text-align:right;font-variant-numeric:tabular-nums}:host(.row--hoverable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--clickable) .row-container{cursor:pointer}:host(.row--clickable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--selected) .row-container{background-color:var(--snice-color-primary-subtle,rgb(239 246 255));box-shadow:inset 2px 0 0 0 var(--snice-color-primary,rgb(37 99 235))}:host(.row--selected.row--hoverable) .row-container:hover{background-color:var(--snice-color-primary-subtle-hover,var(--snice-color-primary-subtle,rgb(219 234 254)))}:host(.row--highlighted) .row-container{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important;animation:2s ease-out row-highlight-fade}@keyframes row-highlight-fade{0%{background-color:var(--snice-color-warning-subtle-hover,rgb(254 252 232))}100%{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))}}:host(:focus) .row-container{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(37 99 235 / .5));outline-offset:-2px}:host(.row--selectable){tabindex:0}:host(.row--striped) .row-container{background-color:var(--snice-color-surface-container-low,rgb(245 245 245))}:host(.row--bordered) .row-container{border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}:host(.row--small) .cell{padding:.5rem .75rem;min-height:2rem;font-size:.75rem}:host(.row--small) .row-container{min-height:2rem}:host(.row--large) .cell{padding:1rem 1.25rem;min-height:3.5rem;font-size:1rem}:host(.row--large) .row-container{min-height:3.5rem}@media (max-width:768px){.cell{padding:.5rem .75rem;font-size:.875rem}.cell--checkbox{width:2.5rem;min-width:2.5rem;max-width:2.5rem;padding:.5rem}.row-checkbox{width:.875rem;height:.875rem}}:host(.row--loading) .row-container{opacity:.6;pointer-events:none}:host(.row--loading) .row-container::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(90deg,transparent,var(--snice-color-surface,rgb(255 255 255 / .6)),transparent);animation:1.5s infinite loading-shimmer}@keyframes loading-shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@media (prefers-reduced-motion:reduce){.row-container{transition:none}:host(.row--highlighted) .row-container{animation:none;background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important}:host(.row--loading) .row-container::after{animation:none}}@media (prefers-contrast:high){.cell{border-right:1px solid}.row-container{border-bottom:1px solid}:host(.row--selected) .row-container{border:2px solid}}\";","import { element, property, watch, ready, dispatch, render, styles, html, css, unsafeHTML, on } from 'snice';\nimport cssContent from './snice-row.css?inline';\nimport type {\n SniceRowElement,\n ColumnDefinition,\n SniceCellElement\n} from './snice-table.types';\nimport './snice-cell';\nimport './snice-cell-text';\nimport './snice-cell-number';\nimport './snice-cell-date';\nimport './snice-cell-boolean';\nimport './snice-cell-rating';\nimport './snice-cell-progress';\nimport './snice-cell-duration';\nimport './snice-cell-filesize';\nimport './snice-cell-sparkline';\nimport './snice-cell-link';\nimport './snice-cell-actions';\nimport './snice-cell-tag';\nimport './snice-cell-image';\nimport './snice-cell-email';\nimport './snice-cell-phone';\nimport './snice-cell-status';\nimport './snice-cell-color';\nimport './snice-cell-json';\nimport './snice-cell-currency';\nimport './snice-cell-percentage';\nimport './snice-cell-location';\n\n@element('snice-row')\nexport class SniceRow extends HTMLElement implements SniceRowElement {\n @property({ type: Boolean, })\n selected: boolean = false;\n\n @property({ type: Boolean, })\n hoverable: boolean = true;\n\n @property({ type: Boolean, })\n clickable: boolean = false;\n\n @property({ type: Boolean, })\n selectable: boolean = false;\n\n /** Table-owned guard for declarative rows that remain visible but fail a\n * conditional selectability predicate. */\n @property({ type: Boolean, attribute: false })\n selectionDisabled: boolean = false;\n\n @property({ type: Object, attribute: false })\n data: any = {};\n\n // Extract data from data-* attributes - pass raw values, let cells handle conversion\n private extractDataFromAttributes() {\n const data: any = {};\n\n // Get all attribute names that start with data-\n const attrNames = this.getAttributeNames().filter(name =>\n name.startsWith('data-') && name !== 'data-column-index'\n );\n\n attrNames.forEach(attrName => {\n const key = attrName.slice(5); // Remove 'data-' prefix\n const value = this.getAttribute(attrName);\n if (value !== null) {\n data[key] = value; // Keep as raw string, let cells convert\n }\n });\n return data;\n }\n\n @property({ type: Number, })\n index: number = 0;\n\n @property({ type: Array, attribute: false })\n columns: ColumnDefinition[] = [];\n\n @render()\n render() {\n return html/*html*/`\n <div class=\"row-container\" part=\"container\" @click=${(e: MouseEvent) => this.handleRowClick(e)} @keydown=${(e: KeyboardEvent) => this.handleKeyDown(e)}>\n <if ${this.selectable}>\n ${this.renderCheckbox()}\n </if>\n <div class=\"cells-container\">\n <if ${this.columns && this.columns.length}>\n ${this.columns.map((column, columnIndex) => this.renderCell(column, columnIndex))}\n </if>\n <if ${!this.columns || !this.columns.length}>\n <!-- No columns set yet -->\n </if>\n </div>\n </div>\n `;\n }\n\n @styles()\n styles() {\n return css/*css*/`${cssContent}`;\n }\n\n @ready()\n init() {\n // Extract data from data-* attributes if data object is empty\n if (!this.data || Object.keys(this.data).length === 0) {\n this.data = this.extractDataFromAttributes();\n }\n this.updateRowAttributes();\n this.configureCells();\n }\n\n private configureCells() {\n if (!this.columns) {\n return;\n }\n\n this.columns.forEach((column, index) => {\n const cellElement = this.shadowRoot?.querySelector(`[data-column-index=\"${index}\"]`) as any;\n if (cellElement) {\n const value = this.data[column.key];\n if (typeof column.renderCell === 'function') {\n const output = column.renderCell(value, this.data, column);\n const replacement = output instanceof HTMLElement ? output : document.createElement('span');\n if (!(output instanceof HTMLElement)) replacement.textContent = output == null ? '' : String(output);\n replacement.setAttribute('data-column-index', String(index));\n cellElement.replaceWith(replacement);\n this.applyCellPresentation(replacement.parentElement as HTMLElement, column, value);\n return;\n }\n\n const formatter = column.formatter || column.valueFormatter;\n cellElement.value = formatter ? formatter(value, this.data) : value;\n cellElement.column = formatter\n ? { ...column, type: 'text', formatter: undefined, valueFormatter: undefined }\n : column;\n cellElement.rowData = this.data;\n this.applyCellPresentation(cellElement.parentElement as HTMLElement, column, value);\n\n // For sparkline cells, also set the data property if value is an array\n if (column.type === 'sparkline' && Array.isArray(value)) {\n cellElement.data = value;\n }\n }\n });\n }\n\n @watch('selected')\n updateSelection() {\n this.updateRowAttributes();\n const checkbox = this.shadowRoot?.querySelector('.row-checkbox') as HTMLInputElement;\n if (checkbox) {\n checkbox.checked = this.selected;\n }\n }\n\n @watch('hoverable', 'clickable', 'selectable', 'selectionDisabled')\n updateRowAttributes() {\n this.classList.toggle('row--hoverable', this.hoverable);\n this.classList.toggle('row--clickable', this.clickable);\n this.classList.toggle('row--selectable', this.selectable);\n this.classList.toggle('row--selection-disabled', this.selectionDisabled);\n this.classList.toggle('row--selected', this.selected);\n }\n\n @watch('data', 'columns')\n updateCells() {\n // Re-render is handled automatically by @render decorator\n // Just need to reconfigure cells after the template updates\n setTimeout(() => this.configureCells(), 0);\n }\n\n private handleRowClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n\n // Handle checkbox change separately\n if (target.matches('.row-checkbox')) {\n return; // Let the change event handle this\n }\n\n // Don't trigger row click if clicking on other interactive elements\n if (target.matches('button, a, .interactive')) {\n return;\n }\n\n if (this.clickable) {\n this.dispatchRowClick();\n }\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n }\n }\n\n private handleChange(e: Event) {\n const target = e.target as HTMLElement;\n if (!target.matches('.row-checkbox')) return;\n\n const checkbox = target as HTMLInputElement;\n if (this.selectionDisabled) {\n checkbox.checked = this.selected;\n return;\n }\n this.selected = checkbox.checked;\n this.dispatchRowSelect();\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n } else if (this.clickable) {\n this.dispatchRowClick();\n }\n }\n }\n\n @on('mouseenter')\n private handleRowHover() {\n this.dispatchRowHover();\n }\n\n private renderCheckbox() {\n return html/*html*/`\n <div class=\"cell cell--checkbox\" part=\"checkbox-cell\">\n <input\n type=\"checkbox\"\n class=\"row-checkbox\"\n ?checked=${this.selected}\n ?disabled=${this.selectionDisabled}\n tabindex=\"-1\"\n @change=${(e: Event) => this.handleChange(e)}\n />\n </div>\n `;\n }\n\n private renderCell(column: ColumnDefinition, columnIndex: number) {\n const value = this.data[column.key];\n const cellComponent = this.getCellComponent(\n column.formatter || column.valueFormatter ? 'text' : column.type\n );\n\n return html/*html*/`\n <div class=\"cell cell--${column.type}\" part=\"cell\" style=\"${this.getCellStyles(column)}\">\n ${unsafeHTML(`<${cellComponent}\n type=\"${column.type}\"\n align=\"${column.align || this.getDefaultAlign(column.type)}\"\n data-column-index=\"${columnIndex}\"\n ></${cellComponent}>`)}\n </div>\n `;\n }\n\n private getDefaultAlign(type?: string): 'left' | 'center' | 'right' {\n if (['number', 'currency', 'percent', 'percentage', 'duration', 'filesize', 'accounting', 'scientific', 'fraction'].includes(type || '')) return 'right';\n if (['boolean', 'rating', 'image'].includes(type || '')) return 'center';\n return 'left';\n }\n\n private applyCellPresentation(wrapper: HTMLElement | null, column: ColumnDefinition, value: any) {\n if (!wrapper) return;\n const applyStyle = (style?: ColumnDefinition['style']) => {\n if (!style) return;\n Object.assign(wrapper.style, style);\n };\n applyStyle(column.style);\n for (const rule of column.conditionalFormats || []) {\n if (!rule.condition(value, this.data)) continue;\n applyStyle(rule.style);\n if (rule.className) wrapper.classList.add(rule.className);\n break;\n }\n if (column.tooltip) {\n wrapper.title = typeof column.tooltip === 'function'\n ? column.tooltip(value, this.data)\n : (value == null ? '' : String(value));\n }\n }\n\n private getCellComponent(type: string | undefined): string {\n switch (type) {\n case 'text':\n return 'snice-cell-text';\n case 'number':\n case 'accounting':\n case 'scientific':\n case 'fraction':\n return 'snice-cell-number';\n case 'date':\n return 'snice-cell-date';\n case 'boolean':\n return 'snice-cell-boolean';\n case 'sparkline':\n return 'snice-cell-sparkline';\n case 'rating':\n return 'snice-cell-rating';\n case 'progress':\n return 'snice-cell-progress';\n case 'duration':\n return 'snice-cell-duration';\n case 'filesize':\n return 'snice-cell-filesize';\n case 'link':\n case 'url':\n return 'snice-cell-link';\n case 'actions':\n return 'snice-cell-actions';\n case 'tag':\n case 'tags':\n case 'badge':\n case 'badges':\n return 'snice-cell-tag';\n case 'image':\n case 'avatar':\n case 'thumbnail':\n return 'snice-cell-image';\n case 'email':\n return 'snice-cell-email';\n case 'phone':\n case 'tel':\n case 'telephone':\n return 'snice-cell-phone';\n case 'status':\n return 'snice-cell-status';\n case 'color':\n return 'snice-cell-color';\n case 'json':\n case 'object':\n return 'snice-cell-json';\n case 'currency':\n case 'money':\n return 'snice-cell-currency';\n case 'percent':\n case 'percentage':\n return 'snice-cell-percentage';\n case 'location':\n case 'address':\n case 'coordinates':\n return 'snice-cell-location';\n case 'custom':\n default:\n return 'snice-cell';\n }\n }\n\n private getCellStyles(column: ColumnDefinition): string {\n let styles = [];\n\n if (column.width) {\n styles.push(`width: ${column.width}`);\n styles.push(`min-width: ${column.width}`);\n styles.push(`max-width: ${column.width}`);\n }\n\n if (column.align) {\n styles.push(`text-align: ${column.align}`);\n }\n\n return styles.join('; ');\n }\n\n private escapeHtml(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const str = String(value);\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n private toggleSelection() {\n this.selected = !this.selected;\n this.dispatchRowSelect();\n }\n\n @dispatch('row-click', { bubbles: true, composed: true })\n private dispatchRowClick() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-select', { bubbles: true, composed: true })\n private dispatchRowSelect() {\n return {\n selected: this.selected,\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-hover', { bubbles: true, composed: true })\n private dispatchRowHover() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n // Public API methods\n select() {\n if (this.selectionDisabled || !this.selectable) return;\n this.selected = true;\n this.dispatchRowSelect();\n }\n\n deselect() {\n this.selected = false;\n this.dispatchRowSelect();\n }\n\n focusRow() {\n super.focus();\n this.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n\n getCellValue(columnKey: string): any {\n return this.data[columnKey];\n }\n\n setCellValue(columnKey: string, value: any) {\n this.data = { ...this.data, [columnKey]: value };\n this.updateCells();\n }\n\n getCellElement(columnKey: string): SniceCellElement | null {\n const column = this.columns.find(col => col.key === columnKey);\n if (!column) return null;\n\n const columnIndex = this.columns.indexOf(column);\n return this.shadowRoot?.querySelector(`[data-column-index=\"${columnIndex}\"]`) as SniceCellElement || null;\n }\n\n // Highlight row temporarily (useful for showing updates)\n highlight(duration: number = 2000) {\n this.classList.add('row--highlighted');\n setTimeout(() => {\n this.classList.remove('row--highlighted');\n }, duration);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snice-row.js","sources":["../../../components/table/snice-row.css?inline","../../../../components/table/snice-row.ts"],"sourcesContent":["export default \":host([hidden]){display:none}:host{display:block;width:100%;min-height:2.5rem}.row-container{display:flex;align-items:stretch;width:100%;min-height:2.5rem;background:0 0;color:var(--snice-color-text,rgb(23 23 23));border-bottom:1px solid var(--snice-color-border,rgb(226 226 226));transition:background-color .15s}.cell{display:flex;align-items:center;border-right:1px solid var(--snice-color-border,rgb(226 226 226));min-height:2.5rem;min-width:6.25rem;flex:1;word-wrap:break-word;overflow:hidden;color:var(--snice-color-text,rgb(23 23 23))}.cell:last-child{border-right:none}.cell--checkbox{width:3rem;min-width:3rem;max-width:3rem;padding:.75rem;justify-content:center}.row-checkbox{width:1rem;height:1rem;cursor:pointer;margin:0;display:block;accent-color:var(--snice-color-primary,rgb(37 99 235))}.cells-container{display:flex;flex:1;align-items:stretch}.cell--text{text-align:left}.cell--accounting,.cell--currency,.cell--fraction,.cell--number,.cell--percent,.cell--scientific{text-align:right;font-variant-numeric:tabular-nums}.cell--date{min-width:8rem;font-variant-numeric:tabular-nums}.cell--boolean{text-align:center;font-size:1rem}.cell--rating{text-align:center;min-width:6rem}.cell--progress{min-width:8rem}.cell--sparkline{text-align:center;min-width:6rem}.cell--duration,.cell--filesize{text-align:right;font-variant-numeric:tabular-nums}:host(.row--hoverable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--clickable) .row-container{cursor:pointer}:host(.row--clickable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--selected) .row-container{background-color:var(--snice-color-primary-subtle,rgb(239 246 255));box-shadow:inset 2px 0 0 0 var(--snice-color-primary,rgb(37 99 235))}:host(.row--selected.row--hoverable) .row-container:hover{background-color:var(--snice-color-primary-subtle-hover,var(--snice-color-primary-subtle,rgb(219 234 254)))}:host(.row--highlighted) .row-container{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important;animation:2s ease-out row-highlight-fade}@keyframes row-highlight-fade{0%{background-color:var(--snice-color-warning-subtle-hover,rgb(254 252 232))}100%{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))}}:host(:focus) .row-container{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(37 99 235 / .5));outline-offset:-2px}:host(.row--selectable){tabindex:0}:host(.row--striped) .row-container{background-color:var(--snice-color-surface-container-low,rgb(245 245 245))}:host(.row--bordered) .row-container{border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}:host(.row--small) .cell{padding:.5rem .75rem;min-height:2rem;font-size:.75rem}:host(.row--small) .row-container{min-height:2rem}:host(.row--large) .cell{padding:1rem 1.25rem;min-height:3.5rem;font-size:1rem}:host(.row--large) .row-container{min-height:3.5rem}@media (max-width:768px){.cell{padding:.5rem .75rem;font-size:.875rem}.cell--checkbox{width:2.5rem;min-width:2.5rem;max-width:2.5rem;padding:.5rem}.row-checkbox{width:.875rem;height:.875rem}}:host(.row--loading) .row-container{opacity:.6;pointer-events:none}:host(.row--loading) .row-container::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(90deg,transparent,var(--snice-color-surface,rgb(255 255 255 / .6)),transparent);animation:1.5s infinite loading-shimmer}@keyframes loading-shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@media (prefers-reduced-motion:reduce){.row-container{transition:none}:host(.row--highlighted) .row-container{animation:none;background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important}:host(.row--loading) .row-container::after{animation:none}}@media (prefers-contrast:high){.cell{border-right:1px solid}.row-container{border-bottom:1px solid}:host(.row--selected) .row-container{border:2px solid}}\";","import { element, property, watch, ready, dispatch, render, styles, html, css, unsafeHTML, on } from 'snice';\nimport cssContent from './snice-row.css?inline';\nimport type {\n SniceRowElement,\n ColumnDefinition,\n SniceCellElement\n} from './snice-table.types';\nimport './snice-cell';\nimport './snice-cell-text';\nimport './snice-cell-number';\nimport './snice-cell-date';\nimport './snice-cell-boolean';\nimport './snice-cell-rating';\nimport './snice-cell-progress';\nimport './snice-cell-duration';\nimport './snice-cell-filesize';\nimport './snice-cell-sparkline';\nimport './snice-cell-link';\nimport './snice-cell-actions';\nimport './snice-cell-tag';\nimport './snice-cell-image';\nimport './snice-cell-email';\nimport './snice-cell-phone';\nimport './snice-cell-status';\nimport './snice-cell-color';\nimport './snice-cell-json';\nimport './snice-cell-currency';\nimport './snice-cell-percentage';\nimport './snice-cell-location';\n\n@element('snice-row')\nexport class SniceRow extends HTMLElement implements SniceRowElement {\n @property({ type: Boolean, })\n selected: boolean = false;\n\n @property({ type: Boolean, })\n hoverable: boolean = true;\n\n @property({ type: Boolean, })\n clickable: boolean = false;\n\n @property({ type: Boolean, })\n selectable: boolean = false;\n\n /** Table-owned guard for declarative rows that remain visible but fail a\n * conditional selectability predicate. */\n @property({ type: Boolean, attribute: false })\n selectionDisabled: boolean = false;\n\n @property({ type: Object, attribute: false })\n data: any = {};\n\n // Extract data from data-* attributes - pass raw values, let cells handle conversion\n private extractDataFromAttributes() {\n const data: any = {};\n\n // Get all attribute names that start with data-\n const attrNames = this.getAttributeNames().filter(name =>\n name.startsWith('data-') && name !== 'data-column-index'\n );\n\n attrNames.forEach(attrName => {\n const key = attrName.slice(5); // Remove 'data-' prefix\n const value = this.getAttribute(attrName);\n if (value !== null) {\n data[key] = value; // Keep as raw string, let cells convert\n }\n });\n return data;\n }\n\n @property({ type: Number, })\n index: number = 0;\n\n @property({ type: Array, attribute: false })\n columns: ColumnDefinition[] = [];\n\n @render()\n render() {\n return html/*html*/`\n <div class=\"row-container\" part=\"container\" @click=${(e: MouseEvent) => this.handleRowClick(e)} @keydown=${(e: KeyboardEvent) => this.handleKeyDown(e)}>\n <if ${this.selectable}>\n ${this.renderCheckbox()}\n </if>\n <div class=\"cells-container\">\n <if ${this.columns && this.columns.length}>\n ${this.columns.map((column, columnIndex) => this.renderCell(column, columnIndex))}\n </if>\n <if ${!this.columns || !this.columns.length}>\n <!-- No columns set yet -->\n </if>\n </div>\n </div>\n `;\n }\n\n @styles()\n styles() {\n return css/*css*/`${cssContent}`;\n }\n\n @ready()\n init() {\n // Extract data from data-* attributes if data object is empty\n if (!this.data || Object.keys(this.data).length === 0) {\n this.data = this.extractDataFromAttributes();\n }\n this.updateRowAttributes();\n this.configureCells();\n }\n\n /**\n * The column's working value for this row: `valueGetter` runs for display\n * here exactly as it does on the table's own render path, so a column whose\n * key names a server field rather than a row field still paints.\n */\n private cellValue(column: ColumnDefinition): any {\n const raw = this.data?.[column.key];\n return column.valueGetter ? column.valueGetter(raw, this.data) : raw;\n }\n\n private configureCells() {\n if (!this.columns) {\n return;\n }\n\n this.columns.forEach((column, index) => {\n const cellElement = this.shadowRoot?.querySelector(`[data-column-index=\"${index}\"]`) as any;\n if (cellElement) {\n const value = this.cellValue(column);\n if (typeof column.renderCell === 'function') {\n const output = column.renderCell(value, this.data, column);\n const replacement = output instanceof HTMLElement ? output : document.createElement('span');\n if (!(output instanceof HTMLElement)) replacement.textContent = output == null ? '' : String(output);\n replacement.setAttribute('data-column-index', String(index));\n cellElement.replaceWith(replacement);\n this.applyCellPresentation(replacement.parentElement as HTMLElement, column, value);\n return;\n }\n\n const formatter = column.formatter || column.valueFormatter;\n cellElement.value = formatter ? String(formatter(value, this.data) ?? '') : value;\n cellElement.column = formatter\n ? { ...column, type: 'text', formatter: undefined, valueFormatter: undefined }\n : column;\n cellElement.rowData = this.data;\n this.applyCellPresentation(cellElement.parentElement as HTMLElement, column, value);\n\n // For sparkline cells, also set the data property if value is an array\n if (column.type === 'sparkline' && Array.isArray(value)) {\n cellElement.data = value;\n }\n }\n });\n }\n\n @watch('selected')\n updateSelection() {\n this.updateRowAttributes();\n const checkbox = this.shadowRoot?.querySelector('.row-checkbox') as HTMLInputElement;\n if (checkbox) {\n checkbox.checked = this.selected;\n }\n }\n\n @watch('hoverable', 'clickable', 'selectable', 'selectionDisabled')\n updateRowAttributes() {\n this.classList.toggle('row--hoverable', this.hoverable);\n this.classList.toggle('row--clickable', this.clickable);\n this.classList.toggle('row--selectable', this.selectable);\n this.classList.toggle('row--selection-disabled', this.selectionDisabled);\n this.classList.toggle('row--selected', this.selected);\n }\n\n @watch('data', 'columns')\n updateCells() {\n // Re-render is handled automatically by @render decorator\n // Just need to reconfigure cells after the template updates\n setTimeout(() => this.configureCells(), 0);\n }\n\n private handleRowClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n\n // Handle checkbox change separately\n if (target.matches('.row-checkbox')) {\n return; // Let the change event handle this\n }\n\n // Don't trigger row click if clicking on other interactive elements\n if (target.matches('button, a, .interactive')) {\n return;\n }\n\n if (this.clickable) {\n this.dispatchRowClick();\n }\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n }\n }\n\n private handleChange(e: Event) {\n const target = e.target as HTMLElement;\n if (!target.matches('.row-checkbox')) return;\n\n const checkbox = target as HTMLInputElement;\n if (this.selectionDisabled) {\n checkbox.checked = this.selected;\n return;\n }\n this.selected = checkbox.checked;\n this.dispatchRowSelect();\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n } else if (this.clickable) {\n this.dispatchRowClick();\n }\n }\n }\n\n @on('mouseenter')\n private handleRowHover() {\n this.dispatchRowHover();\n }\n\n private renderCheckbox() {\n return html/*html*/`\n <div class=\"cell cell--checkbox\" part=\"checkbox-cell\">\n <input\n type=\"checkbox\"\n class=\"row-checkbox\"\n ?checked=${this.selected}\n ?disabled=${this.selectionDisabled}\n tabindex=\"-1\"\n @change=${(e: Event) => this.handleChange(e)}\n />\n </div>\n `;\n }\n\n private renderCell(column: ColumnDefinition, columnIndex: number) {\n const cellComponent = this.getCellComponent(\n column.formatter || column.valueFormatter ? 'text' : column.type\n );\n\n return html/*html*/`\n <div class=\"cell cell--${column.type}\" part=\"cell\" style=\"${this.getCellStyles(column)}\">\n ${unsafeHTML(`<${cellComponent}\n type=\"${column.type}\"\n align=\"${column.align || this.getDefaultAlign(column.type)}\"\n data-column-index=\"${columnIndex}\"\n ></${cellComponent}>`)}\n </div>\n `;\n }\n\n private getDefaultAlign(type?: string): 'left' | 'center' | 'right' {\n if (['number', 'currency', 'percent', 'percentage', 'duration', 'filesize', 'accounting', 'scientific', 'fraction'].includes(type || '')) return 'right';\n if (['boolean', 'rating', 'image'].includes(type || '')) return 'center';\n return 'left';\n }\n\n private applyCellPresentation(wrapper: HTMLElement | null, column: ColumnDefinition, value: any) {\n if (!wrapper) return;\n const applyStyle = (style?: ColumnDefinition['style']) => {\n if (!style) return;\n Object.assign(wrapper.style, style);\n };\n applyStyle(column.style);\n for (const rule of column.conditionalFormats || []) {\n if (!rule.condition(value, this.data)) continue;\n applyStyle(rule.style);\n if (rule.className) wrapper.classList.add(rule.className);\n break;\n }\n if (column.tooltip) {\n wrapper.title = typeof column.tooltip === 'function'\n ? column.tooltip(value, this.data)\n : (value == null ? '' : String(value));\n }\n }\n\n private getCellComponent(type: string | undefined): string {\n switch (type) {\n case 'text':\n return 'snice-cell-text';\n case 'number':\n case 'accounting':\n case 'scientific':\n case 'fraction':\n return 'snice-cell-number';\n case 'date':\n return 'snice-cell-date';\n case 'boolean':\n return 'snice-cell-boolean';\n case 'sparkline':\n return 'snice-cell-sparkline';\n case 'rating':\n return 'snice-cell-rating';\n case 'progress':\n return 'snice-cell-progress';\n case 'duration':\n return 'snice-cell-duration';\n case 'filesize':\n return 'snice-cell-filesize';\n case 'link':\n case 'url':\n return 'snice-cell-link';\n case 'actions':\n return 'snice-cell-actions';\n case 'tag':\n case 'tags':\n case 'badge':\n case 'badges':\n return 'snice-cell-tag';\n case 'image':\n case 'avatar':\n case 'thumbnail':\n return 'snice-cell-image';\n case 'email':\n return 'snice-cell-email';\n case 'phone':\n case 'tel':\n case 'telephone':\n return 'snice-cell-phone';\n case 'status':\n return 'snice-cell-status';\n case 'color':\n return 'snice-cell-color';\n case 'json':\n case 'object':\n return 'snice-cell-json';\n case 'currency':\n case 'money':\n return 'snice-cell-currency';\n case 'percent':\n case 'percentage':\n return 'snice-cell-percentage';\n case 'location':\n case 'address':\n case 'coordinates':\n return 'snice-cell-location';\n case 'custom':\n default:\n return 'snice-cell';\n }\n }\n\n private getCellStyles(column: ColumnDefinition): string {\n let styles = [];\n\n if (column.width) {\n styles.push(`width: ${column.width}`);\n styles.push(`min-width: ${column.width}`);\n styles.push(`max-width: ${column.width}`);\n }\n\n if (column.align) {\n styles.push(`text-align: ${column.align}`);\n }\n\n return styles.join('; ');\n }\n\n private escapeHtml(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const str = String(value);\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n private toggleSelection() {\n this.selected = !this.selected;\n this.dispatchRowSelect();\n }\n\n @dispatch('row-click', { bubbles: true, composed: true })\n private dispatchRowClick() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-select', { bubbles: true, composed: true })\n private dispatchRowSelect() {\n return {\n selected: this.selected,\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-hover', { bubbles: true, composed: true })\n private dispatchRowHover() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n // Public API methods\n select() {\n if (this.selectionDisabled || !this.selectable) return;\n this.selected = true;\n this.dispatchRowSelect();\n }\n\n deselect() {\n this.selected = false;\n this.dispatchRowSelect();\n }\n\n focusRow() {\n super.focus();\n this.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n\n getCellValue(columnKey: string): any {\n return this.data[columnKey];\n }\n\n setCellValue(columnKey: string, value: any) {\n this.data = { ...this.data, [columnKey]: value };\n this.updateCells();\n }\n\n getCellElement(columnKey: string): SniceCellElement | null {\n const column = this.columns.find(col => col.key === columnKey);\n if (!column) return null;\n\n const columnIndex = this.columns.indexOf(column);\n return this.shadowRoot?.querySelector(`[data-column-index=\"${columnIndex}\"]`) as SniceCellElement || null;\n }\n\n // Highlight row temporarily (useful for showing updates)\n highlight(duration: number = 2000) {\n this.classList.add('row--highlighted');\n setTimeout(() => {\n this.classList.remove('row--highlighted');\n }, duration);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -141,6 +141,7 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
|
|
|
141
141
|
styles(): import("snice").CSSResult;
|
|
142
142
|
render(): import("snice").TemplateResult;
|
|
143
143
|
renderControls(): void;
|
|
144
|
+
handleFrameResize(): void;
|
|
144
145
|
initialize(): Promise<void>;
|
|
145
146
|
private processSlottedContent;
|
|
146
147
|
/** Whether declarative rows need the full grouping/aggregation table model. */
|
|
@@ -190,6 +191,14 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
|
|
|
190
191
|
renderHeader(): void;
|
|
191
192
|
renderSortableHeader(column: any): string;
|
|
192
193
|
renderBody(): void;
|
|
194
|
+
/**
|
|
195
|
+
* When the host is taller than its rows, append an inert filler row so the
|
|
196
|
+
* column grid runs to the bottom edge of the frame. Cloned from the last
|
|
197
|
+
* data row, so column widths, pinning, and alignment track the table
|
|
198
|
+
* engine natively. Removed entirely when content fills (or overflows) the
|
|
199
|
+
* frame, restoring the plain last-row styling.
|
|
200
|
+
*/
|
|
201
|
+
private updateFillRow;
|
|
193
202
|
private reconcileRows;
|
|
194
203
|
/**
|
|
195
204
|
* A structural fingerprint of everything `createRow` reads that is NOT
|
|
@@ -202,12 +211,28 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
|
|
|
202
211
|
private rendererIdSeq;
|
|
203
212
|
private rendererIdFor;
|
|
204
213
|
private computeStructuralSig;
|
|
214
|
+
/**
|
|
215
|
+
* A fingerprint of a row's own field values, so a row object that was mutated
|
|
216
|
+
* IN PLACE (the same identity re-delivered by a poll/websocket patch, or an
|
|
217
|
+
* array the app edits) is rebuilt instead of recycled with stale cells.
|
|
218
|
+
*
|
|
219
|
+
* Tradeoff, deliberately chosen: this walks the row's OWN, SHALLOW fields
|
|
220
|
+
* rather than running each column's valueGetter/formatter. It therefore costs
|
|
221
|
+
* one string build per rendered row — never a user callback, so call counts
|
|
222
|
+
* for `valueGetter` stay exactly one per row per render — and it still catches
|
|
223
|
+
* getter-derived columns, because a getter reads the fields this covers.
|
|
224
|
+
* Nested objects collapse to their String() form, so a mutation buried inside
|
|
225
|
+
* a nested object (or an object rendered by a JSON/progress cell) is not
|
|
226
|
+
* detected; those callers should hand over a new row object. Recycling keeps
|
|
227
|
+
* its payoff: rows whose values did not change are still reused untouched.
|
|
228
|
+
*/
|
|
229
|
+
private rowValueSignature;
|
|
205
230
|
/**
|
|
206
231
|
* The per-row rebuild signature. Selection and the plain data-index are
|
|
207
232
|
* re-stamped on reuse (not here) so they never force a rebuild; this captures
|
|
208
|
-
*
|
|
209
|
-
* when a feature embeds the index in a row-scoped
|
|
210
|
-
* master-detail toggle index) — the index itself.
|
|
233
|
+
* the row's cell values plus what a re-stamp cannot repair: tree node state,
|
|
234
|
+
* per-row height, and — when a feature embeds the index in a row-scoped
|
|
235
|
+
* closure (row DnD drag index, master-detail toggle index) — the index itself.
|
|
211
236
|
*/
|
|
212
237
|
private rowSignature;
|
|
213
238
|
/** Whether the row at `index` currently hosts an inline editor. */
|
|
@@ -233,6 +258,12 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
|
|
|
233
258
|
private dispatchPageChange;
|
|
234
259
|
renderPagination(): void;
|
|
235
260
|
private pageButton;
|
|
261
|
+
/**
|
|
262
|
+
* The column's display text, or null when the column declares no display
|
|
263
|
+
* formatter. `formatter` (row-aware) is the display formatter and
|
|
264
|
+
* `valueFormatter` its documented fallback, so `formatter` wins.
|
|
265
|
+
*/
|
|
266
|
+
private cellDisplayText;
|
|
236
267
|
/** Create a cell element safely using createElement + setAttribute */
|
|
237
268
|
createCellElement(column: any, value: any, row?: any): HTMLElement;
|
|
238
269
|
getCellTagName(type: string): string;
|
|
@@ -251,6 +282,12 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
|
|
|
251
282
|
private updateRowSelectionStateFor;
|
|
252
283
|
updateSelectAllState(): void;
|
|
253
284
|
toggleSort(columnKey: string, multiSort?: boolean): void;
|
|
285
|
+
/**
|
|
286
|
+
* Reorder `this.data` to the current client-side sort (or back to delivery
|
|
287
|
+
* order when the sort was cleared). Split out of sortLocalData so a fresh
|
|
288
|
+
* delivery can land sorted without re-entering the render/index bookkeeping.
|
|
289
|
+
*/
|
|
290
|
+
private applyLocalSortOrder;
|
|
254
291
|
private sortLocalData;
|
|
255
292
|
private dispatchRowSelectionChanged;
|
|
256
293
|
private dispatchRowClicked;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esDecorate, __runInitializers } from 'tslib';
|
|
2
|
-
import { element, property, query, request, styles, render, ready, on, watch, dispatch, dispose, css, html } from 'snice';
|
|
2
|
+
import { element, property, query, request, styles, render, observe, ready, on, watch, dispatch, dispose, css, html } from 'snice';
|
|
3
3
|
import '../input/snice-input.js';
|
|
4
4
|
import '../select/snice-select.js';
|
|
5
5
|
import '../button/snice-button.js';
|
|
@@ -192,6 +192,7 @@ let SniceTable = (() => {
|
|
|
192
192
|
let _getTableData_decorators;
|
|
193
193
|
let _styles_decorators;
|
|
194
194
|
let _render_decorators;
|
|
195
|
+
let _handleFrameResize_decorators;
|
|
195
196
|
let _initialize_decorators;
|
|
196
197
|
let _handleDeclarativeColumnChange_decorators;
|
|
197
198
|
let _handleSelectorOptionsChange_decorators;
|
|
@@ -289,6 +290,7 @@ let SniceTable = (() => {
|
|
|
289
290
|
_getTableData_decorators = [request('table/data')];
|
|
290
291
|
_styles_decorators = [styles()];
|
|
291
292
|
_render_decorators = [render()];
|
|
293
|
+
_handleFrameResize_decorators = [observe('resize', '.table-frame')];
|
|
292
294
|
_initialize_decorators = [ready()];
|
|
293
295
|
_handleDeclarativeColumnChange_decorators = [on('column-changed')];
|
|
294
296
|
_handleSelectorOptionsChange_decorators = [watch('selectorOptions')];
|
|
@@ -337,6 +339,7 @@ let SniceTable = (() => {
|
|
|
337
339
|
__esDecorate(this, null, _getTableData_decorators, { kind: "method", name: "getTableData", static: false, private: false, access: { has: obj => "getTableData" in obj, get: obj => obj.getTableData }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
338
340
|
__esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
339
341
|
__esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
342
|
+
__esDecorate(this, null, _handleFrameResize_decorators, { kind: "method", name: "handleFrameResize", static: false, private: false, access: { has: obj => "handleFrameResize" in obj, get: obj => obj.handleFrameResize }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
340
343
|
__esDecorate(this, null, _initialize_decorators, { kind: "method", name: "initialize", static: false, private: false, access: { has: obj => "initialize" in obj, get: obj => obj.initialize }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
341
344
|
__esDecorate(this, null, _handleDeclarativeColumnChange_decorators, { kind: "method", name: "handleDeclarativeColumnChange", static: false, private: false, access: { has: obj => "handleDeclarativeColumnChange" in obj, get: obj => obj.handleDeclarativeColumnChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
342
345
|
__esDecorate(this, null, _handleSelectorOptionsChange_decorators, { kind: "method", name: "handleSelectorOptionsChange", static: false, private: false, access: { has: obj => "handleSelectorOptionsChange" in obj, get: obj => obj.handleSelectorOptionsChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
@@ -655,6 +658,27 @@ let SniceTable = (() => {
|
|
|
655
658
|
border-bottom: none;
|
|
656
659
|
}
|
|
657
660
|
|
|
661
|
+
/* Height fill: when the host is taller than its rows, an inert filler
|
|
662
|
+
row (cloned from the last data row, so column widths and pinning
|
|
663
|
+
track the table engine) keeps the column grid running to the bottom
|
|
664
|
+
edge instead of the borders cutting off where the rows end. */
|
|
665
|
+
tbody tr.table-fill-row {
|
|
666
|
+
pointer-events: none;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
tbody tr.table-fill-row td {
|
|
670
|
+
border-bottom: none;
|
|
671
|
+
padding: 0;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
:host([striped]) tbody tr.table-fill-row {
|
|
675
|
+
background: transparent;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
:host([hoverable]) tbody tr.table-fill-row:hover {
|
|
679
|
+
background: transparent;
|
|
680
|
+
}
|
|
681
|
+
|
|
658
682
|
th {
|
|
659
683
|
padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-sm, 0.75rem);
|
|
660
684
|
}
|
|
@@ -1678,6 +1702,11 @@ let SniceTable = (() => {
|
|
|
1678
1702
|
}
|
|
1679
1703
|
container.appendChild(controlsDiv);
|
|
1680
1704
|
}
|
|
1705
|
+
// Re-derive the fill row whenever the frame's box changes (host resized,
|
|
1706
|
+
// fullscreen toggled) — the leftover space below the rows changes with it.
|
|
1707
|
+
handleFrameResize() {
|
|
1708
|
+
this.updateFillRow();
|
|
1709
|
+
}
|
|
1681
1710
|
async initialize() {
|
|
1682
1711
|
// Listen for controller attached event
|
|
1683
1712
|
this.addEventListener('controller-attached', this.onAttached);
|
|
@@ -1979,8 +2008,14 @@ let SniceTable = (() => {
|
|
|
1979
2008
|
if (this.settingSortedData)
|
|
1980
2009
|
return;
|
|
1981
2010
|
this.unsortedData = [...this.data];
|
|
2011
|
+
// C3: rows delivered while a client-side sort is active must land in that
|
|
2012
|
+
// sorted order — the currentSort watcher only fires when the sort itself
|
|
2013
|
+
// changes, so without this the body silently contradicts the header. In
|
|
2014
|
+
// remote mode the server owns the ordering.
|
|
2015
|
+
if (this.mode !== 'remote' && this.currentSort.length > 0)
|
|
2016
|
+
this.applyLocalSortOrder();
|
|
1982
2017
|
this.rebuildRowIndex();
|
|
1983
|
-
this.masterDetail.prepare(this.data);
|
|
2018
|
+
this.masterDetail.prepare(this.data, row => this.rowValueSignature(row));
|
|
1984
2019
|
if (this.settingDataImperative)
|
|
1985
2020
|
return; // imperative setData(): caller renders
|
|
1986
2021
|
this.scheduleRender('body');
|
|
@@ -2436,6 +2471,7 @@ let SniceTable = (() => {
|
|
|
2436
2471
|
// Still render pagination
|
|
2437
2472
|
if (this.pagination)
|
|
2438
2473
|
this.renderPagination();
|
|
2474
|
+
this.updateSelectAllState();
|
|
2439
2475
|
return;
|
|
2440
2476
|
}
|
|
2441
2477
|
if (this.data.length === 0 && this.columns.length > 0) {
|
|
@@ -2652,10 +2688,52 @@ let SniceTable = (() => {
|
|
|
2652
2688
|
this.reconcileRows(entries);
|
|
2653
2689
|
// Re-establish grid role + roving tabindex after the body changed.
|
|
2654
2690
|
this.keyboard.refresh();
|
|
2691
|
+
// The select-all control describes the *filtered* row set, so it goes stale
|
|
2692
|
+
// whenever the denominator moves (rows delivered, filter cleared) even
|
|
2693
|
+
// though `selectedRows` — its only other trigger — never changed.
|
|
2694
|
+
this.updateSelectAllState();
|
|
2655
2695
|
// Render pagination after body
|
|
2656
2696
|
if (this.pagination) {
|
|
2657
2697
|
this.renderPagination();
|
|
2658
2698
|
}
|
|
2699
|
+
this.updateFillRow();
|
|
2700
|
+
}
|
|
2701
|
+
/**
|
|
2702
|
+
* When the host is taller than its rows, append an inert filler row so the
|
|
2703
|
+
* column grid runs to the bottom edge of the frame. Cloned from the last
|
|
2704
|
+
* data row, so column widths, pinning, and alignment track the table
|
|
2705
|
+
* engine natively. Removed entirely when content fills (or overflows) the
|
|
2706
|
+
* frame, restoring the plain last-row styling.
|
|
2707
|
+
*/
|
|
2708
|
+
updateFillRow() {
|
|
2709
|
+
const frame = this.shadowRoot?.querySelector('.table-frame');
|
|
2710
|
+
const tableEl = frame?.querySelector('table');
|
|
2711
|
+
const tbody = tableEl?.querySelector('tbody');
|
|
2712
|
+
if (!frame || !tableEl || !tbody)
|
|
2713
|
+
return;
|
|
2714
|
+
tbody.querySelector('tr.table-fill-row')?.remove();
|
|
2715
|
+
if (this.list && this.listRenderer)
|
|
2716
|
+
return;
|
|
2717
|
+
const rows = tbody.querySelectorAll('tr[data-index]');
|
|
2718
|
+
const lastRow = rows[rows.length - 1];
|
|
2719
|
+
if (!lastRow)
|
|
2720
|
+
return;
|
|
2721
|
+
const leftover = Math.floor(frame.clientHeight - tableEl.offsetHeight);
|
|
2722
|
+
if (leftover <= 1)
|
|
2723
|
+
return;
|
|
2724
|
+
const fill = lastRow.cloneNode(true);
|
|
2725
|
+
fill.className = 'table-fill-row';
|
|
2726
|
+
for (const attr of ['data-index', 'data-selected', 'role', 'aria-rowindex', 'aria-selected', 'tabindex', 'id']) {
|
|
2727
|
+
fill.removeAttribute(attr);
|
|
2728
|
+
}
|
|
2729
|
+
fill.setAttribute('aria-hidden', 'true');
|
|
2730
|
+
fill.querySelectorAll('td').forEach(td => {
|
|
2731
|
+
td.replaceChildren();
|
|
2732
|
+
for (const attr of ['role', 'aria-colindex', 'tabindex', 'aria-selected'])
|
|
2733
|
+
td.removeAttribute(attr);
|
|
2734
|
+
});
|
|
2735
|
+
fill.style.height = `${leftover}px`;
|
|
2736
|
+
tbody.appendChild(fill);
|
|
2659
2737
|
}
|
|
2660
2738
|
// ── Task B: render-path reconciler ──────────────────────────────────────
|
|
2661
2739
|
//
|
|
@@ -2746,15 +2824,41 @@ let SniceTable = (() => {
|
|
|
2746
2824
|
`tree=${this.treeData.isEnabled() ? this.treeData.getGroupColumn() : ''}`,
|
|
2747
2825
|
].join('|');
|
|
2748
2826
|
}
|
|
2827
|
+
/**
|
|
2828
|
+
* A fingerprint of a row's own field values, so a row object that was mutated
|
|
2829
|
+
* IN PLACE (the same identity re-delivered by a poll/websocket patch, or an
|
|
2830
|
+
* array the app edits) is rebuilt instead of recycled with stale cells.
|
|
2831
|
+
*
|
|
2832
|
+
* Tradeoff, deliberately chosen: this walks the row's OWN, SHALLOW fields
|
|
2833
|
+
* rather than running each column's valueGetter/formatter. It therefore costs
|
|
2834
|
+
* one string build per rendered row — never a user callback, so call counts
|
|
2835
|
+
* for `valueGetter` stay exactly one per row per render — and it still catches
|
|
2836
|
+
* getter-derived columns, because a getter reads the fields this covers.
|
|
2837
|
+
* Nested objects collapse to their String() form, so a mutation buried inside
|
|
2838
|
+
* a nested object (or an object rendered by a JSON/progress cell) is not
|
|
2839
|
+
* detected; those callers should hand over a new row object. Recycling keeps
|
|
2840
|
+
* its payoff: rows whose values did not change are still reused untouched.
|
|
2841
|
+
*/
|
|
2842
|
+
rowValueSignature(rowData) {
|
|
2843
|
+
if (rowData === null || typeof rowData !== 'object')
|
|
2844
|
+
return String(rowData);
|
|
2845
|
+
const parts = [];
|
|
2846
|
+
for (const key of Object.keys(rowData)) {
|
|
2847
|
+
const value = rowData[key];
|
|
2848
|
+
parts.push(`${key}=${value === null || value === undefined ? '' : String(value)}`);
|
|
2849
|
+
}
|
|
2850
|
+
// A separator keeps {a:'1b'} from colliding with {a:'1',b:''}.
|
|
2851
|
+
return parts.join('|');
|
|
2852
|
+
}
|
|
2749
2853
|
/**
|
|
2750
2854
|
* The per-row rebuild signature. Selection and the plain data-index are
|
|
2751
2855
|
* re-stamped on reuse (not here) so they never force a rebuild; this captures
|
|
2752
|
-
*
|
|
2753
|
-
* when a feature embeds the index in a row-scoped
|
|
2754
|
-
* master-detail toggle index) — the index itself.
|
|
2856
|
+
* the row's cell values plus what a re-stamp cannot repair: tree node state,
|
|
2857
|
+
* per-row height, and — when a feature embeds the index in a row-scoped
|
|
2858
|
+
* closure (row DnD drag index, master-detail toggle index) — the index itself.
|
|
2755
2859
|
*/
|
|
2756
2860
|
rowSignature(rowData, index, structuralSig, treeRow) {
|
|
2757
|
-
const parts = [structuralSig];
|
|
2861
|
+
const parts = [structuralSig, `v:${this.rowValueSignature(rowData)}`];
|
|
2758
2862
|
if (treeRow)
|
|
2759
2863
|
parts.push(`t:${treeRow.depth}:${treeRow.expanded ? 1 : 0}:${treeRow.hasChildren ? 1 : 0}`);
|
|
2760
2864
|
if (this.rowHeightCallback)
|
|
@@ -2951,6 +3055,15 @@ let SniceTable = (() => {
|
|
|
2951
3055
|
const active = page === this.currentPage ? ' pagination__btn--active' : '';
|
|
2952
3056
|
return `<button class="pagination__btn pagination__page${active}" data-page="${page}">${page}</button>`;
|
|
2953
3057
|
}
|
|
3058
|
+
/**
|
|
3059
|
+
* The column's display text, or null when the column declares no display
|
|
3060
|
+
* formatter. `formatter` (row-aware) is the display formatter and
|
|
3061
|
+
* `valueFormatter` its documented fallback, so `formatter` wins.
|
|
3062
|
+
*/
|
|
3063
|
+
cellDisplayText(column, value, row) {
|
|
3064
|
+
const formatter = column.formatter || column.valueFormatter;
|
|
3065
|
+
return formatter ? String(formatter(value, row) ?? '') : null;
|
|
3066
|
+
}
|
|
2954
3067
|
/** Create a cell element safely using createElement + setAttribute */
|
|
2955
3068
|
createCellElement(column, value, row) {
|
|
2956
3069
|
// E2: a custom renderCell bypasses the type-based cell entirely. A string
|
|
@@ -2975,22 +3088,38 @@ let SniceTable = (() => {
|
|
|
2975
3088
|
if (column.align)
|
|
2976
3089
|
el.setAttribute('align', column.align);
|
|
2977
3090
|
el.setAttribute('in-table', 'true');
|
|
3091
|
+
// A declared display formatter makes the cell's value its DISPLAY text:
|
|
3092
|
+
// the pipeline (valueGetter -> formatter, valueFormatter as the fallback)
|
|
3093
|
+
// is resolved here, once, so the `value` channel a caller reads is what the
|
|
3094
|
+
// cell actually shows. The cell is marked `formatted` and handed a column
|
|
3095
|
+
// without the formatters, which keeps it from formatting again and tells
|
|
3096
|
+
// the shared presentation contract to paint the text over any type-specific
|
|
3097
|
+
// rendering (a rating/progress/link cell cannot render display text).
|
|
3098
|
+
const displayText = this.cellDisplayText(column, value, row);
|
|
3099
|
+
const cellColumn = displayText === null
|
|
3100
|
+
? column
|
|
3101
|
+
: { ...column, formatter: undefined, valueFormatter: undefined };
|
|
2978
3102
|
// Set the property directly so arrays/objects reach progress, sparkline,
|
|
2979
3103
|
// JSON, action, and tag cells without a lossy attribute conversion. Keep a
|
|
2980
3104
|
// primitive attribute for declarative inspection and CSS selectors.
|
|
2981
|
-
if (
|
|
3105
|
+
if (displayText !== null) {
|
|
3106
|
+
el.setAttribute('formatted', '');
|
|
3107
|
+
el.value = displayText;
|
|
3108
|
+
el.setAttribute('value', displayText);
|
|
3109
|
+
}
|
|
3110
|
+
else if (column.type === 'sparkline' && value !== null && typeof value === 'object') {
|
|
2982
3111
|
el.setAttribute('value', JSON.stringify(value));
|
|
2983
3112
|
if (Array.isArray(value))
|
|
2984
3113
|
el.data = value;
|
|
2985
3114
|
}
|
|
2986
3115
|
else {
|
|
2987
3116
|
el.value = value ?? '';
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
3117
|
+
if (value === null || typeof value !== 'object') {
|
|
3118
|
+
el.setAttribute('value', String(value ?? ''));
|
|
3119
|
+
}
|
|
2991
3120
|
}
|
|
2992
3121
|
// Column definition as property (for formatter access etc.)
|
|
2993
|
-
el.column =
|
|
3122
|
+
el.column = cellColumn;
|
|
2994
3123
|
// Row-aware formatters, conditional formatting, and action-cell events all
|
|
2995
3124
|
// consume the originating row through the cell's property API.
|
|
2996
3125
|
el.rowData = row ?? null;
|
|
@@ -3280,7 +3409,12 @@ let SniceTable = (() => {
|
|
|
3280
3409
|
this.sortLocalData();
|
|
3281
3410
|
}
|
|
3282
3411
|
}
|
|
3283
|
-
|
|
3412
|
+
/**
|
|
3413
|
+
* Reorder `this.data` to the current client-side sort (or back to delivery
|
|
3414
|
+
* order when the sort was cleared). Split out of sortLocalData so a fresh
|
|
3415
|
+
* delivery can land sorted without re-entering the render/index bookkeeping.
|
|
3416
|
+
*/
|
|
3417
|
+
applyLocalSortOrder() {
|
|
3284
3418
|
if (!this.unsortedData.length) {
|
|
3285
3419
|
this.unsortedData = [...this.data];
|
|
3286
3420
|
}
|
|
@@ -3295,16 +3429,19 @@ let SniceTable = (() => {
|
|
|
3295
3429
|
for (const { column, direction } of this.currentSort) {
|
|
3296
3430
|
const colDef = this.columns.find(c => c.key === column);
|
|
3297
3431
|
const customComparator = colDef?.sortComparator;
|
|
3432
|
+
// The value pipeline feeds BOTH sort paths: valueGetter "runs for
|
|
3433
|
+
// display, sort, aggregation", so a custom comparator sees the same
|
|
3434
|
+
// derived value the cell shows (remote columns routinely key on the
|
|
3435
|
+
// server's sort field and bridge the display with a getter).
|
|
3436
|
+
const aVal = colDef?.valueGetter ? colDef.valueGetter(a[column], a) : a[column];
|
|
3437
|
+
const bVal = colDef?.valueGetter ? colDef.valueGetter(b[column], b) : b[column];
|
|
3298
3438
|
if (customComparator) {
|
|
3299
|
-
const cmp = customComparator(
|
|
3439
|
+
const cmp = customComparator(aVal, bVal, direction);
|
|
3300
3440
|
if (cmp !== 0)
|
|
3301
3441
|
return cmp;
|
|
3302
3442
|
}
|
|
3303
3443
|
else {
|
|
3304
|
-
|
|
3305
|
-
const aVal = colDef?.valueGetter ? colDef.valueGetter(a[column], a) : (a[column] ?? '');
|
|
3306
|
-
const bVal = colDef?.valueGetter ? colDef.valueGetter(b[column], b) : (b[column] ?? '');
|
|
3307
|
-
const cmp = String(aVal).localeCompare(String(bVal), undefined, { numeric: true });
|
|
3444
|
+
const cmp = String(aVal ?? '').localeCompare(String(bVal ?? ''), undefined, { numeric: true });
|
|
3308
3445
|
if (cmp !== 0)
|
|
3309
3446
|
return direction === 'asc' ? cmp : -cmp;
|
|
3310
3447
|
}
|
|
@@ -3313,6 +3450,9 @@ let SniceTable = (() => {
|
|
|
3313
3450
|
});
|
|
3314
3451
|
}
|
|
3315
3452
|
this.settingSortedData = false;
|
|
3453
|
+
}
|
|
3454
|
+
sortLocalData() {
|
|
3455
|
+
this.applyLocalSortOrder();
|
|
3316
3456
|
// Sort replaced this.data (new order + reference) — resync the row-index
|
|
3317
3457
|
// map and drop the stale filtered snapshot before re-rendering. Render is
|
|
3318
3458
|
// queued (not synchronous): sortLocalData is reachable from the currentSort
|