@revolist/revogrid 4.8.19 → 4.9.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/dist/cjs/{column.service-ad5ffa3c.js → column.service-6f691f50.js} +2 -2
- package/dist/cjs/{column.service-ad5ffa3c.js.map → column.service-6f691f50.js.map} +1 -1
- package/dist/cjs/{header-cell-renderer-d92249e4.js → header-cell-renderer-81a22b00.js} +2 -2
- package/dist/cjs/{header-cell-renderer-d92249e4.js.map → header-cell-renderer-81a22b00.js.map} +1 -1
- package/dist/cjs/{index-a9f1b728.js → index-2410bbd9.js} +1 -3
- package/dist/cjs/index-2410bbd9.js.map +1 -0
- package/dist/cjs/{key.utils-e6c8a895.js → key.utils-1e48ab8f.js} +2 -2
- package/dist/cjs/{key.utils-e6c8a895.js.map → key.utils-1e48ab8f.js.map} +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/revo-grid.cjs.entry.js +15 -19
- package/dist/cjs/revo-grid.cjs.entry.js.map +1 -1
- package/dist/cjs/revo-grid.cjs.js +1 -1
- package/dist/cjs/revogr-attribution_6.cjs.entry.js +4 -4
- package/dist/cjs/revogr-clipboard_3.cjs.entry.js +2 -2
- package/dist/cjs/revogr-data_4.cjs.entry.js +4 -4
- package/dist/cjs/revogr-filter-panel.cjs.entry.js +14 -17
- package/dist/cjs/revogr-filter-panel.cjs.entry.js.map +1 -1
- package/dist/cjs/{throttle-46478b04.js → throttle-bcc4740d.js} +2 -2
- package/dist/cjs/{throttle-46478b04.js.map → throttle-bcc4740d.js.map} +1 -1
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/revoGrid/revo-grid.js +10 -15
- package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
- package/dist/collection/plugins/filter/{filter.pop.js → filter.panel.js} +23 -43
- package/dist/collection/plugins/filter/filter.panel.js.map +1 -0
- package/dist/collection/plugins/filter/filter.plugin.js +2 -2
- package/dist/collection/plugins/filter/filter.plugin.js.map +1 -1
- package/dist/collection/types/viewport.interfaces.js.map +1 -1
- package/dist/collection/utils/consts.js +0 -1
- package/dist/collection/utils/consts.js.map +1 -1
- package/dist/esm/{column.service-dce8aabc.js → column.service-0e41057a.js} +2 -2
- package/dist/esm/{column.service-dce8aabc.js.map → column.service-0e41057a.js.map} +1 -1
- package/dist/esm/{header-cell-renderer-171a011c.js → header-cell-renderer-6d8ac25d.js} +2 -2
- package/dist/esm/{header-cell-renderer-171a011c.js.map → header-cell-renderer-6d8ac25d.js.map} +1 -1
- package/dist/esm/{index-5a722722.js → index-4e881436.js} +2 -3
- package/dist/esm/index-4e881436.js.map +1 -0
- package/dist/esm/{key.utils-f82409ff.js → key.utils-425c987d.js} +2 -2
- package/dist/esm/{key.utils-f82409ff.js.map → key.utils-425c987d.js.map} +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/revo-grid.entry.js +15 -19
- package/dist/esm/revo-grid.entry.js.map +1 -1
- package/dist/esm/revo-grid.js +1 -1
- package/dist/esm/revogr-attribution_6.entry.js +4 -4
- package/dist/esm/revogr-clipboard_3.entry.js +2 -2
- package/dist/esm/revogr-data_4.entry.js +4 -4
- package/dist/esm/revogr-filter-panel.entry.js +15 -18
- package/dist/esm/revogr-filter-panel.entry.js.map +1 -1
- package/dist/esm/{throttle-eeca0062.js → throttle-1b1dd9d2.js} +2 -2
- package/dist/esm/{throttle-eeca0062.js.map → throttle-1b1dd9d2.js.map} +1 -1
- package/dist/revo-grid/{column.service-dce8aabc.js → column.service-0e41057a.js} +2 -2
- package/dist/revo-grid/{header-cell-renderer-171a011c.js → header-cell-renderer-6d8ac25d.js} +2 -2
- package/dist/revo-grid/index-4e881436.js +5 -0
- package/dist/revo-grid/index-4e881436.js.map +1 -0
- package/dist/revo-grid/{key.utils-f82409ff.js → key.utils-425c987d.js} +2 -2
- package/dist/revo-grid/revo-grid.entry.js +1 -1
- package/dist/revo-grid/revo-grid.entry.js.map +1 -1
- package/dist/revo-grid/revo-grid.esm.js +1 -1
- package/dist/revo-grid/revo-grid.esm.js.map +1 -1
- package/dist/revo-grid/revogr-attribution_6.entry.js +1 -1
- package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
- package/dist/revo-grid/revogr-data_4.entry.js +1 -1
- package/dist/revo-grid/revogr-filter-panel.entry.js +1 -1
- package/dist/revo-grid/revogr-filter-panel.entry.js.map +1 -1
- package/dist/revo-grid/{throttle-eeca0062.js → throttle-1b1dd9d2.js} +2 -2
- package/dist/types/components/revoGrid/revo-grid.d.ts +0 -1
- package/dist/types/components.d.ts +2 -4
- package/dist/types/plugins/filter/{filter.pop.d.ts → filter.panel.d.ts} +1 -2
- package/dist/types/plugins/filter/filter.plugin.d.ts +2 -2
- package/dist/types/types/viewport.interfaces.d.ts +0 -2
- package/dist/types/utils/consts.d.ts +0 -1
- package/hydrate/index.js +27 -36
- package/hydrate/index.mjs +27 -36
- package/package.json +1 -1
- package/standalone/consts.js +1 -2
- package/standalone/consts.js.map +1 -1
- package/standalone/index.d.ts +1 -1
- package/standalone/revo-grid.js +13 -17
- package/standalone/revo-grid.js.map +1 -1
- package/standalone/revogr-filter-panel.js +14 -18
- package/standalone/revogr-filter-panel.js.map +1 -1
- package/dist/cjs/index-a9f1b728.js.map +0 -1
- package/dist/collection/plugins/filter/filter.pop.js.map +0 -1
- package/dist/esm/index-5a722722.js.map +0 -1
- package/dist/revo-grid/index-5a722722.js +0 -5
- package/dist/revo-grid/index-5a722722.js.map +0 -1
- /package/dist/revo-grid/{column.service-dce8aabc.js.map → column.service-0e41057a.js.map} +0 -0
- /package/dist/revo-grid/{header-cell-renderer-171a011c.js.map → header-cell-renderer-6d8ac25d.js.map} +0 -0
- /package/dist/revo-grid/{key.utils-f82409ff.js.map → key.utils-425c987d.js.map} +0 -0
- /package/dist/revo-grid/{throttle-eeca0062.js.map → throttle-1b1dd9d2.js.map} +0 -0
package/hydrate/index.js
CHANGED
|
@@ -3046,7 +3046,7 @@ class FilterPanel {
|
|
|
3046
3046
|
title: 'Filter by',
|
|
3047
3047
|
save: 'Save',
|
|
3048
3048
|
// drops the filter
|
|
3049
|
-
reset: '
|
|
3049
|
+
reset: 'Clear changes',
|
|
3050
3050
|
cancel: 'Close',
|
|
3051
3051
|
add: 'Add more condition...',
|
|
3052
3052
|
placeholder: 'Enter value...',
|
|
@@ -3061,7 +3061,6 @@ class FilterPanel {
|
|
|
3061
3061
|
this.currentFilterId = -1;
|
|
3062
3062
|
this.currentFilterType = defaultType;
|
|
3063
3063
|
this.changes = undefined;
|
|
3064
|
-
this.uuid = undefined;
|
|
3065
3064
|
this.filterItems = {};
|
|
3066
3065
|
this.filterTypes = {};
|
|
3067
3066
|
this.filterNames = {};
|
|
@@ -3072,7 +3071,18 @@ class FilterPanel {
|
|
|
3072
3071
|
onMouseDown(e) {
|
|
3073
3072
|
if (this.changes && !e.defaultPrevented) {
|
|
3074
3073
|
const el = e.target;
|
|
3075
|
-
|
|
3074
|
+
const select = document.getElementById('add-filter');
|
|
3075
|
+
if (select) {
|
|
3076
|
+
select.value = defaultType;
|
|
3077
|
+
}
|
|
3078
|
+
this.currentFilterType = defaultType;
|
|
3079
|
+
if (this.changes) {
|
|
3080
|
+
this.changes.type = defaultType;
|
|
3081
|
+
}
|
|
3082
|
+
this.currentFilterId = -1;
|
|
3083
|
+
const path = e.composedPath();
|
|
3084
|
+
const isOutside = !path.includes(this.element);
|
|
3085
|
+
if (isOutside && !isFilterBtn(el)) {
|
|
3076
3086
|
this.changes = undefined;
|
|
3077
3087
|
}
|
|
3078
3088
|
}
|
|
@@ -3285,26 +3295,12 @@ class FilterPanel {
|
|
|
3285
3295
|
throw new Error('Changes required per edit');
|
|
3286
3296
|
}
|
|
3287
3297
|
}
|
|
3288
|
-
|
|
3289
|
-
const select = document.getElementById('add-filter');
|
|
3290
|
-
if (select)
|
|
3291
|
-
select.value = defaultType;
|
|
3292
|
-
this.currentFilterType = defaultType;
|
|
3293
|
-
if (this.changes) {
|
|
3294
|
-
this.changes.type = defaultType;
|
|
3295
|
-
}
|
|
3296
|
-
this.currentFilterId = -1;
|
|
3297
|
-
if (e === null || e === void 0 ? void 0 : e.classList.contains(`[uuid="${this.uuid}"]`)) {
|
|
3298
|
-
return false;
|
|
3299
|
-
}
|
|
3300
|
-
return !(e === null || e === void 0 ? void 0 : e.closest(`[uuid="${this.uuid}"]`));
|
|
3301
|
-
}
|
|
3298
|
+
get element() { return getElement(this); }
|
|
3302
3299
|
static get style() { return RevogrFilterPanelStyle0; }
|
|
3303
3300
|
static get cmpMeta() { return {
|
|
3304
3301
|
"$flags$": 0,
|
|
3305
3302
|
"$tagName$": "revogr-filter-panel",
|
|
3306
3303
|
"$members$": {
|
|
3307
|
-
"uuid": [1537],
|
|
3308
3304
|
"filterItems": [16],
|
|
3309
3305
|
"filterTypes": [16],
|
|
3310
3306
|
"filterNames": [16],
|
|
@@ -3321,7 +3317,7 @@ class FilterPanel {
|
|
|
3321
3317
|
},
|
|
3322
3318
|
"$listeners$": [[5, "mousedown", "onMouseDown"]],
|
|
3323
3319
|
"$lazyBundleId$": "-",
|
|
3324
|
-
"$attrsToReflect$": [
|
|
3320
|
+
"$attrsToReflect$": []
|
|
3325
3321
|
}; }
|
|
3326
3322
|
}
|
|
3327
3323
|
|
|
@@ -8426,7 +8422,6 @@ const MIN_COL_SIZE = 30;
|
|
|
8426
8422
|
const RESIZE_INTERVAL = 40;
|
|
8427
8423
|
const DATA_COL = 'data-rgCol';
|
|
8428
8424
|
const DATA_ROW = 'data-rgRow';
|
|
8429
|
-
const UUID = 'grid-uuid';
|
|
8430
8425
|
const DISABLED_CLASS = 'disabled';
|
|
8431
8426
|
const CELL_CLASS = 'rgCell';
|
|
8432
8427
|
const ROW_HEADER_TYPE = 'rowHeaders';
|
|
@@ -11667,7 +11662,7 @@ const filterTypes = {
|
|
|
11667
11662
|
const FILTER_TRIMMED_TYPE = 'filter';
|
|
11668
11663
|
const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
|
|
11669
11664
|
class FilterPlugin extends BasePlugin {
|
|
11670
|
-
constructor(revogrid, providers,
|
|
11665
|
+
constructor(revogrid, providers, config) {
|
|
11671
11666
|
var _a;
|
|
11672
11667
|
super(revogrid, providers);
|
|
11673
11668
|
this.revogrid = revogrid;
|
|
@@ -11716,7 +11711,7 @@ class FilterPlugin extends BasePlugin {
|
|
|
11716
11711
|
const existingNodes = this.revogrid.registerVNode.filter((n) => n.$tag$ !== 'revogr-filter-panel');
|
|
11717
11712
|
this.revogrid.registerVNode = [
|
|
11718
11713
|
...existingNodes,
|
|
11719
|
-
hAsync("revogr-filter-panel", {
|
|
11714
|
+
hAsync("revogr-filter-panel", { filterItems: this.multiFilterItems, filterNames: this.possibleFilterNames, filterEntities: this.possibleFilterEntities, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, ref: e => (this.pop = e) }),
|
|
11720
11715
|
];
|
|
11721
11716
|
}
|
|
11722
11717
|
initConfig(config) {
|
|
@@ -14212,8 +14207,6 @@ class RevoGridComponent {
|
|
|
14212
14207
|
// #region Listeners outside scope
|
|
14213
14208
|
this.clickTrackForFocusClear = null;
|
|
14214
14209
|
this.extraElements = [];
|
|
14215
|
-
// UUID required to support multiple grids in one page and avoid collision
|
|
14216
|
-
this.uuid = null;
|
|
14217
14210
|
this.viewport = null;
|
|
14218
14211
|
this.isInited = false;
|
|
14219
14212
|
/**
|
|
@@ -14460,19 +14453,19 @@ class RevoGridComponent {
|
|
|
14460
14453
|
if (event.defaultPrevented) {
|
|
14461
14454
|
return;
|
|
14462
14455
|
}
|
|
14463
|
-
const target = event.target;
|
|
14464
14456
|
const pos = screenX + screenY;
|
|
14465
14457
|
// detect if mousemove then do nothing
|
|
14466
14458
|
if (Math.abs(this.clickTrackForFocusClear - pos) > 10) {
|
|
14467
14459
|
return;
|
|
14468
14460
|
}
|
|
14469
|
-
//
|
|
14470
|
-
// clear data which is outside of grid
|
|
14461
|
+
// Check if action finished inside of the document
|
|
14471
14462
|
// if event prevented or it is current table don't clear focus
|
|
14472
|
-
|
|
14473
|
-
|
|
14463
|
+
const path = event.composedPath();
|
|
14464
|
+
if (!path.includes(this.element) &&
|
|
14465
|
+
!path.includes(this.element.shadowRoot)) {
|
|
14466
|
+
// Perform actions if the click is outside the component
|
|
14467
|
+
this.clearFocus();
|
|
14474
14468
|
}
|
|
14475
|
-
this.clearFocus();
|
|
14476
14469
|
}
|
|
14477
14470
|
// #endregion
|
|
14478
14471
|
// #region Listeners
|
|
@@ -14756,7 +14749,7 @@ class RevoGridComponent {
|
|
|
14756
14749
|
}
|
|
14757
14750
|
// register filter plugin
|
|
14758
14751
|
if (this.filter) {
|
|
14759
|
-
this.internalPlugins.push(new FilterPlugin(this.element, pluginData,
|
|
14752
|
+
this.internalPlugins.push(new FilterPlugin(this.element, pluginData, typeof this.filter === 'object' ? this.filter : undefined));
|
|
14760
14753
|
}
|
|
14761
14754
|
// register export plugin
|
|
14762
14755
|
if (this.exporting) {
|
|
@@ -14803,8 +14796,6 @@ class RevoGridComponent {
|
|
|
14803
14796
|
this.selectionStoreConnector = new SelectionStoreConnector();
|
|
14804
14797
|
this.dataProvider = new DataProvider(this.dimensionProvider);
|
|
14805
14798
|
// #endregion
|
|
14806
|
-
// generate uuid for this grid
|
|
14807
|
-
this.uuid = `rv--${Math.random().toString(36).slice(2, 6)}-${Date.now()}`;
|
|
14808
14799
|
this.registerOutsideVNodes(this.registerVNode);
|
|
14809
14800
|
// init plugins
|
|
14810
14801
|
this.setPlugins();
|
|
@@ -14875,7 +14866,7 @@ class RevoGridComponent {
|
|
|
14875
14866
|
const headerProperties = Object.assign(Object.assign({}, view.headerProp), { type: view.type, additionalData: this.additionalData, viewportCol: view.viewportCol, selectionStore: view.columnSelectionStore, canResize: this.resize, readonly: this.readonly, columnFilter: !!this.filter });
|
|
14876
14867
|
// Column headers
|
|
14877
14868
|
const dataViews = [
|
|
14878
|
-
hAsync("revogr-header", Object.assign({ key: '
|
|
14869
|
+
hAsync("revogr-header", Object.assign({ key: 'ff8eefd6db3baf494c015a2ea573160d27739aa9' }, headerProperties, { slot: HEADER_SLOT })),
|
|
14879
14870
|
];
|
|
14880
14871
|
// Render viewport data (vertical sections)
|
|
14881
14872
|
view.dataPorts.forEach(data => {
|
|
@@ -14897,11 +14888,11 @@ class RevoGridComponent {
|
|
|
14897
14888
|
const typeCol = 'rgCol';
|
|
14898
14889
|
const viewports = this.viewportProvider.stores;
|
|
14899
14890
|
const dimensions = this.dimensionProvider.stores;
|
|
14900
|
-
return (hAsync(Host, { key: '
|
|
14891
|
+
return (hAsync(Host, { key: '21bbe81595f20f7bcb271f28c9c86feef472efec' }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: '7a3092cd02305a0dfaa3b3d3160164001f0ed08b', class: "main-viewport", onClick: (e) => {
|
|
14901
14892
|
if (e.currentTarget === e.target) {
|
|
14902
14893
|
this.viewport.clearEdit();
|
|
14903
14894
|
}
|
|
14904
|
-
} }, hAsync("div", { key: '
|
|
14895
|
+
} }, hAsync("div", { key: 'ae1dfccbb72cc2a9f7fa370889746c702d106045', class: "viewports" }, hAsync("slot", { key: '0725b46d877fbb63fb513845cc1c7b86d0f856b8', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: 'd41771f6ff459f1f6747ce496c8165b1dab44963', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '2914421478450c9b198e0aade898ed342e4d7f6a', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: 'bc1812c5ce54cda01e81cc06e28c69dc8e36fdf3', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
|
|
14905
14896
|
}
|
|
14906
14897
|
disconnectedCallback() {
|
|
14907
14898
|
// Remove all plugins, to avoid memory leaks and unexpected behaviour when the component is removed
|
package/hydrate/index.mjs
CHANGED
|
@@ -3042,7 +3042,7 @@ class FilterPanel {
|
|
|
3042
3042
|
title: 'Filter by',
|
|
3043
3043
|
save: 'Save',
|
|
3044
3044
|
// drops the filter
|
|
3045
|
-
reset: '
|
|
3045
|
+
reset: 'Clear changes',
|
|
3046
3046
|
cancel: 'Close',
|
|
3047
3047
|
add: 'Add more condition...',
|
|
3048
3048
|
placeholder: 'Enter value...',
|
|
@@ -3057,7 +3057,6 @@ class FilterPanel {
|
|
|
3057
3057
|
this.currentFilterId = -1;
|
|
3058
3058
|
this.currentFilterType = defaultType;
|
|
3059
3059
|
this.changes = undefined;
|
|
3060
|
-
this.uuid = undefined;
|
|
3061
3060
|
this.filterItems = {};
|
|
3062
3061
|
this.filterTypes = {};
|
|
3063
3062
|
this.filterNames = {};
|
|
@@ -3068,7 +3067,18 @@ class FilterPanel {
|
|
|
3068
3067
|
onMouseDown(e) {
|
|
3069
3068
|
if (this.changes && !e.defaultPrevented) {
|
|
3070
3069
|
const el = e.target;
|
|
3071
|
-
|
|
3070
|
+
const select = document.getElementById('add-filter');
|
|
3071
|
+
if (select) {
|
|
3072
|
+
select.value = defaultType;
|
|
3073
|
+
}
|
|
3074
|
+
this.currentFilterType = defaultType;
|
|
3075
|
+
if (this.changes) {
|
|
3076
|
+
this.changes.type = defaultType;
|
|
3077
|
+
}
|
|
3078
|
+
this.currentFilterId = -1;
|
|
3079
|
+
const path = e.composedPath();
|
|
3080
|
+
const isOutside = !path.includes(this.element);
|
|
3081
|
+
if (isOutside && !isFilterBtn(el)) {
|
|
3072
3082
|
this.changes = undefined;
|
|
3073
3083
|
}
|
|
3074
3084
|
}
|
|
@@ -3281,26 +3291,12 @@ class FilterPanel {
|
|
|
3281
3291
|
throw new Error('Changes required per edit');
|
|
3282
3292
|
}
|
|
3283
3293
|
}
|
|
3284
|
-
|
|
3285
|
-
const select = document.getElementById('add-filter');
|
|
3286
|
-
if (select)
|
|
3287
|
-
select.value = defaultType;
|
|
3288
|
-
this.currentFilterType = defaultType;
|
|
3289
|
-
if (this.changes) {
|
|
3290
|
-
this.changes.type = defaultType;
|
|
3291
|
-
}
|
|
3292
|
-
this.currentFilterId = -1;
|
|
3293
|
-
if (e === null || e === void 0 ? void 0 : e.classList.contains(`[uuid="${this.uuid}"]`)) {
|
|
3294
|
-
return false;
|
|
3295
|
-
}
|
|
3296
|
-
return !(e === null || e === void 0 ? void 0 : e.closest(`[uuid="${this.uuid}"]`));
|
|
3297
|
-
}
|
|
3294
|
+
get element() { return getElement(this); }
|
|
3298
3295
|
static get style() { return RevogrFilterPanelStyle0; }
|
|
3299
3296
|
static get cmpMeta() { return {
|
|
3300
3297
|
"$flags$": 0,
|
|
3301
3298
|
"$tagName$": "revogr-filter-panel",
|
|
3302
3299
|
"$members$": {
|
|
3303
|
-
"uuid": [1537],
|
|
3304
3300
|
"filterItems": [16],
|
|
3305
3301
|
"filterTypes": [16],
|
|
3306
3302
|
"filterNames": [16],
|
|
@@ -3317,7 +3313,7 @@ class FilterPanel {
|
|
|
3317
3313
|
},
|
|
3318
3314
|
"$listeners$": [[5, "mousedown", "onMouseDown"]],
|
|
3319
3315
|
"$lazyBundleId$": "-",
|
|
3320
|
-
"$attrsToReflect$": [
|
|
3316
|
+
"$attrsToReflect$": []
|
|
3321
3317
|
}; }
|
|
3322
3318
|
}
|
|
3323
3319
|
|
|
@@ -8422,7 +8418,6 @@ const MIN_COL_SIZE = 30;
|
|
|
8422
8418
|
const RESIZE_INTERVAL = 40;
|
|
8423
8419
|
const DATA_COL = 'data-rgCol';
|
|
8424
8420
|
const DATA_ROW = 'data-rgRow';
|
|
8425
|
-
const UUID = 'grid-uuid';
|
|
8426
8421
|
const DISABLED_CLASS = 'disabled';
|
|
8427
8422
|
const CELL_CLASS = 'rgCell';
|
|
8428
8423
|
const ROW_HEADER_TYPE = 'rowHeaders';
|
|
@@ -11663,7 +11658,7 @@ const filterTypes = {
|
|
|
11663
11658
|
const FILTER_TRIMMED_TYPE = 'filter';
|
|
11664
11659
|
const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
|
|
11665
11660
|
class FilterPlugin extends BasePlugin {
|
|
11666
|
-
constructor(revogrid, providers,
|
|
11661
|
+
constructor(revogrid, providers, config) {
|
|
11667
11662
|
var _a;
|
|
11668
11663
|
super(revogrid, providers);
|
|
11669
11664
|
this.revogrid = revogrid;
|
|
@@ -11712,7 +11707,7 @@ class FilterPlugin extends BasePlugin {
|
|
|
11712
11707
|
const existingNodes = this.revogrid.registerVNode.filter((n) => n.$tag$ !== 'revogr-filter-panel');
|
|
11713
11708
|
this.revogrid.registerVNode = [
|
|
11714
11709
|
...existingNodes,
|
|
11715
|
-
hAsync("revogr-filter-panel", {
|
|
11710
|
+
hAsync("revogr-filter-panel", { filterItems: this.multiFilterItems, filterNames: this.possibleFilterNames, filterEntities: this.possibleFilterEntities, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, ref: e => (this.pop = e) }),
|
|
11716
11711
|
];
|
|
11717
11712
|
}
|
|
11718
11713
|
initConfig(config) {
|
|
@@ -14208,8 +14203,6 @@ class RevoGridComponent {
|
|
|
14208
14203
|
// #region Listeners outside scope
|
|
14209
14204
|
this.clickTrackForFocusClear = null;
|
|
14210
14205
|
this.extraElements = [];
|
|
14211
|
-
// UUID required to support multiple grids in one page and avoid collision
|
|
14212
|
-
this.uuid = null;
|
|
14213
14206
|
this.viewport = null;
|
|
14214
14207
|
this.isInited = false;
|
|
14215
14208
|
/**
|
|
@@ -14456,19 +14449,19 @@ class RevoGridComponent {
|
|
|
14456
14449
|
if (event.defaultPrevented) {
|
|
14457
14450
|
return;
|
|
14458
14451
|
}
|
|
14459
|
-
const target = event.target;
|
|
14460
14452
|
const pos = screenX + screenY;
|
|
14461
14453
|
// detect if mousemove then do nothing
|
|
14462
14454
|
if (Math.abs(this.clickTrackForFocusClear - pos) > 10) {
|
|
14463
14455
|
return;
|
|
14464
14456
|
}
|
|
14465
|
-
//
|
|
14466
|
-
// clear data which is outside of grid
|
|
14457
|
+
// Check if action finished inside of the document
|
|
14467
14458
|
// if event prevented or it is current table don't clear focus
|
|
14468
|
-
|
|
14469
|
-
|
|
14459
|
+
const path = event.composedPath();
|
|
14460
|
+
if (!path.includes(this.element) &&
|
|
14461
|
+
!path.includes(this.element.shadowRoot)) {
|
|
14462
|
+
// Perform actions if the click is outside the component
|
|
14463
|
+
this.clearFocus();
|
|
14470
14464
|
}
|
|
14471
|
-
this.clearFocus();
|
|
14472
14465
|
}
|
|
14473
14466
|
// #endregion
|
|
14474
14467
|
// #region Listeners
|
|
@@ -14752,7 +14745,7 @@ class RevoGridComponent {
|
|
|
14752
14745
|
}
|
|
14753
14746
|
// register filter plugin
|
|
14754
14747
|
if (this.filter) {
|
|
14755
|
-
this.internalPlugins.push(new FilterPlugin(this.element, pluginData,
|
|
14748
|
+
this.internalPlugins.push(new FilterPlugin(this.element, pluginData, typeof this.filter === 'object' ? this.filter : undefined));
|
|
14756
14749
|
}
|
|
14757
14750
|
// register export plugin
|
|
14758
14751
|
if (this.exporting) {
|
|
@@ -14799,8 +14792,6 @@ class RevoGridComponent {
|
|
|
14799
14792
|
this.selectionStoreConnector = new SelectionStoreConnector();
|
|
14800
14793
|
this.dataProvider = new DataProvider(this.dimensionProvider);
|
|
14801
14794
|
// #endregion
|
|
14802
|
-
// generate uuid for this grid
|
|
14803
|
-
this.uuid = `rv--${Math.random().toString(36).slice(2, 6)}-${Date.now()}`;
|
|
14804
14795
|
this.registerOutsideVNodes(this.registerVNode);
|
|
14805
14796
|
// init plugins
|
|
14806
14797
|
this.setPlugins();
|
|
@@ -14871,7 +14862,7 @@ class RevoGridComponent {
|
|
|
14871
14862
|
const headerProperties = Object.assign(Object.assign({}, view.headerProp), { type: view.type, additionalData: this.additionalData, viewportCol: view.viewportCol, selectionStore: view.columnSelectionStore, canResize: this.resize, readonly: this.readonly, columnFilter: !!this.filter });
|
|
14872
14863
|
// Column headers
|
|
14873
14864
|
const dataViews = [
|
|
14874
|
-
hAsync("revogr-header", Object.assign({ key: '
|
|
14865
|
+
hAsync("revogr-header", Object.assign({ key: 'ff8eefd6db3baf494c015a2ea573160d27739aa9' }, headerProperties, { slot: HEADER_SLOT })),
|
|
14875
14866
|
];
|
|
14876
14867
|
// Render viewport data (vertical sections)
|
|
14877
14868
|
view.dataPorts.forEach(data => {
|
|
@@ -14893,11 +14884,11 @@ class RevoGridComponent {
|
|
|
14893
14884
|
const typeCol = 'rgCol';
|
|
14894
14885
|
const viewports = this.viewportProvider.stores;
|
|
14895
14886
|
const dimensions = this.dimensionProvider.stores;
|
|
14896
|
-
return (hAsync(Host, { key: '
|
|
14887
|
+
return (hAsync(Host, { key: '21bbe81595f20f7bcb271f28c9c86feef472efec' }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: '7a3092cd02305a0dfaa3b3d3160164001f0ed08b', class: "main-viewport", onClick: (e) => {
|
|
14897
14888
|
if (e.currentTarget === e.target) {
|
|
14898
14889
|
this.viewport.clearEdit();
|
|
14899
14890
|
}
|
|
14900
|
-
} }, hAsync("div", { key: '
|
|
14891
|
+
} }, hAsync("div", { key: 'ae1dfccbb72cc2a9f7fa370889746c702d106045', class: "viewports" }, hAsync("slot", { key: '0725b46d877fbb63fb513845cc1c7b86d0f856b8', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: 'd41771f6ff459f1f6747ce496c8165b1dab44963', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '2914421478450c9b198e0aade898ed342e4d7f6a', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: 'bc1812c5ce54cda01e81cc06e28c69dc8e36fdf3', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
|
|
14901
14892
|
}
|
|
14902
14893
|
disconnectedCallback() {
|
|
14903
14894
|
// Remove all plugins, to avoid memory leaks and unexpected behaviour when the component is removed
|
package/package.json
CHANGED
package/standalone/consts.js
CHANGED
|
@@ -5,7 +5,6 @@ const MIN_COL_SIZE = 30;
|
|
|
5
5
|
const RESIZE_INTERVAL = 40;
|
|
6
6
|
const DATA_COL = 'data-rgCol';
|
|
7
7
|
const DATA_ROW = 'data-rgRow';
|
|
8
|
-
const UUID = 'grid-uuid';
|
|
9
8
|
const DISABLED_CLASS = 'disabled';
|
|
10
9
|
const CELL_CLASS = 'rgCell';
|
|
11
10
|
const ROW_HEADER_TYPE = 'rowHeaders';
|
|
@@ -25,6 +24,6 @@ const DRAGG_TEXT = 'Draggable item';
|
|
|
25
24
|
const GRID_INTERNALS = '__rvgr';
|
|
26
25
|
const ROW_FOCUSED_CLASS = 'focused-rgRow';
|
|
27
26
|
|
|
28
|
-
export { CELL_CLASS as C, DATA_COL as D, EDIT_INPUT_WR as E, FOCUS_CLASS as F, GRID_INTERNALS as G, HEADER_CLASS as H, MIN_COL_SIZE as M, RESIZE_INTERVAL as R, SELECTION_BORDER_CLASS as S, TMP_SELECTION_BG_CLASS as T,
|
|
27
|
+
export { CELL_CLASS as C, DATA_COL as D, EDIT_INPUT_WR as E, FOCUS_CLASS as F, GRID_INTERNALS as G, HEADER_CLASS as H, MIN_COL_SIZE as M, RESIZE_INTERVAL as R, SELECTION_BORDER_CLASS as S, TMP_SELECTION_BG_CLASS as T, HEADER_SORTABLE_CLASS as a, HEADER_ROW_CLASS as b, HEADER_ACTUAL_ROW_CLASS as c, DISABLED_CLASS as d, ROW_HEADER_TYPE as e, DATA_ROW as f, ROW_FOCUSED_CLASS as g, DRAGGABLE_CLASS as h, DRAG_ICON_CLASS as i, DRAGG_TEXT as j, CELL_HANDLER_CLASS as k, MOBILE_CLASS as l };
|
|
29
28
|
|
|
30
29
|
//# sourceMappingURL=consts.js.map
|
package/standalone/consts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"consts.js","mappings":";;;MAAa,YAAY,GAAG,GAAG;MAClB,eAAe,GAAG,GAAG;MAErB,QAAQ,GAAG,aAAa;MACxB,QAAQ,GAAG,aAAa;MAExB,
|
|
1
|
+
{"file":"consts.js","mappings":";;;MAAa,YAAY,GAAG,GAAG;MAClB,eAAe,GAAG,GAAG;MAErB,QAAQ,GAAG,aAAa;MACxB,QAAQ,GAAG,aAAa;MAExB,cAAc,GAAG,WAAW;MAC5B,UAAU,GAAG,SAAS;MACtB,eAAe,GAAG,aAAa;MAC/B,YAAY,GAAG,eAAe;MAC9B,qBAAqB,GAAG,WAAW;MACnC,gBAAgB,GAAG,eAAe;MAClC,uBAAuB,GAAG,eAAe;MAEzC,eAAe,GAAG,iBAAiB;MACnC,eAAe,GAAG,iBAAiB;MAEnC,WAAW,GAAG,eAAe;MAC7B,sBAAsB,GAAG,yBAAyB;MAClD,YAAY,GAAG,iBAAiB;MAChC,sBAAsB,GAAG,gBAAgB;MAEzC,kBAAkB,GAAG,kBAAkB;MAEvC,aAAa,GAAG,qBAAqB;MAErC,UAAU,GAAG,iBAAiB;MAC9B,cAAc,GAAG,SAAS;MAC1B,iBAAiB,GAAG;;;;","names":[],"sources":["src/utils/consts.ts"],"sourcesContent":["export const MIN_COL_SIZE = 30;\nexport const RESIZE_INTERVAL = 40;\n\nexport const DATA_COL = 'data-rgCol';\nexport const DATA_ROW = 'data-rgRow';\n\nexport const DISABLED_CLASS = 'disabled';\nexport const CELL_CLASS = 'rgCell';\nexport const ROW_HEADER_TYPE = 'rowHeaders';\nexport const HEADER_CLASS = 'rgHeaderCell';\nexport const HEADER_SORTABLE_CLASS = 'sortable';\nexport const HEADER_ROW_CLASS = 'header-rgRow';\nexport const HEADER_ACTUAL_ROW_CLASS = 'actual-rgRow';\n\nexport const DRAG_ICON_CLASS = 'revo-drag-icon';\nexport const DRAGGABLE_CLASS = 'revo-draggable';\n\nexport const FOCUS_CLASS = 'focused-cell';\nexport const SELECTION_BORDER_CLASS = 'selection-border-range';\nexport const MOBILE_CLASS = 'mobile-handler';\nexport const TMP_SELECTION_BG_CLASS = 'temp-bg-range';\n\nexport const CELL_HANDLER_CLASS = 'autofill-handle';\n\nexport const EDIT_INPUT_WR = 'edit-input-wrapper';\n\nexport const DRAGG_TEXT = 'Draggable item';\nexport const GRID_INTERNALS = '__rvgr';\nexport const ROW_FOCUSED_CLASS = 'focused-rgRow';\n"],"version":3}
|
package/standalone/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { RevogrData as RevogrData } from '../dist/types/components/data/revogr-d
|
|
|
9
9
|
export { defineCustomElement as defineCustomElementRevogrData } from './revogr-data';
|
|
10
10
|
export { RevoEdit as RevogrEdit } from '../dist/types/components/editors/revogr-edit';
|
|
11
11
|
export { defineCustomElement as defineCustomElementRevogrEdit } from './revogr-edit';
|
|
12
|
-
export { FilterPanel as RevogrFilterPanel } from '../dist/types/plugins/filter/filter.
|
|
12
|
+
export { FilterPanel as RevogrFilterPanel } from '../dist/types/plugins/filter/filter.panel';
|
|
13
13
|
export { defineCustomElement as defineCustomElementRevogrFilterPanel } from './revogr-filter-panel';
|
|
14
14
|
export { RevogrFocus as RevogrFocus } from '../dist/types/components/selectionFocus/revogr-focus';
|
|
15
15
|
export { defineCustomElement as defineCustomElementRevogrFocus } from './revogr-focus';
|
package/standalone/revo-grid.js
CHANGED
|
@@ -8,7 +8,7 @@ import { i as createStore, h as setStore, j as findIndex_1, D as DataStore, b as
|
|
|
8
8
|
import { _ as _baseGetTag, i as isObjectLike_1 } from './toNumber.js';
|
|
9
9
|
import { b as isGrouping, d as getGroupingName, G as GROUP_EXPANDED, e as getParsedGroup, f as isSameGroup, h as GROUP_DEPTH, P as PSEUDO_GROUP_ITEM_VALUE, j as PSEUDO_GROUP_ITEM_ID, k as GROUPING_ROW_TYPE, l as PSEUDO_GROUP_COLUMN, m as GROUP_EXPAND_EVENT, o as gatherGrouping, p as isGroupingColumn, E as EMPTY_INDEX, q as SelectionStoreConnector } from './column.service.js';
|
|
10
10
|
import { d as debounce_1 } from './debounce.js';
|
|
11
|
-
import { R as RESIZE_INTERVAL
|
|
11
|
+
import { R as RESIZE_INTERVAL } from './consts.js';
|
|
12
12
|
import { V as ViewportStore, f as calculateRowHeaderSize, h as defineCustomElement$6 } from './revogr-row-headers2.js';
|
|
13
13
|
import { t as timeout, g as getScrollbarSize } from './index2.js';
|
|
14
14
|
import { F as FILTER_PROP, i as isFilterBtn } from './filter.button.js';
|
|
@@ -1254,7 +1254,7 @@ const filterTypes = {
|
|
|
1254
1254
|
const FILTER_TRIMMED_TYPE = 'filter';
|
|
1255
1255
|
const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
|
|
1256
1256
|
class FilterPlugin extends BasePlugin {
|
|
1257
|
-
constructor(revogrid, providers,
|
|
1257
|
+
constructor(revogrid, providers, config) {
|
|
1258
1258
|
var _a;
|
|
1259
1259
|
super(revogrid, providers);
|
|
1260
1260
|
this.revogrid = revogrid;
|
|
@@ -1303,7 +1303,7 @@ class FilterPlugin extends BasePlugin {
|
|
|
1303
1303
|
const existingNodes = this.revogrid.registerVNode.filter((n) => n.$tag$ !== 'revogr-filter-panel');
|
|
1304
1304
|
this.revogrid.registerVNode = [
|
|
1305
1305
|
...existingNodes,
|
|
1306
|
-
h("revogr-filter-panel", {
|
|
1306
|
+
h("revogr-filter-panel", { filterItems: this.multiFilterItems, filterNames: this.possibleFilterNames, filterEntities: this.possibleFilterEntities, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, ref: e => (this.pop = e) }),
|
|
1307
1307
|
];
|
|
1308
1308
|
}
|
|
1309
1309
|
initConfig(config) {
|
|
@@ -3439,8 +3439,6 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
|
|
|
3439
3439
|
// #region Listeners outside scope
|
|
3440
3440
|
this.clickTrackForFocusClear = null;
|
|
3441
3441
|
this.extraElements = [];
|
|
3442
|
-
// UUID required to support multiple grids in one page and avoid collision
|
|
3443
|
-
this.uuid = null;
|
|
3444
3442
|
this.viewport = null;
|
|
3445
3443
|
this.isInited = false;
|
|
3446
3444
|
/**
|
|
@@ -3687,19 +3685,19 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
|
|
|
3687
3685
|
if (event.defaultPrevented) {
|
|
3688
3686
|
return;
|
|
3689
3687
|
}
|
|
3690
|
-
const target = event.target;
|
|
3691
3688
|
const pos = screenX + screenY;
|
|
3692
3689
|
// detect if mousemove then do nothing
|
|
3693
3690
|
if (Math.abs(this.clickTrackForFocusClear - pos) > 10) {
|
|
3694
3691
|
return;
|
|
3695
3692
|
}
|
|
3696
|
-
//
|
|
3697
|
-
// clear data which is outside of grid
|
|
3693
|
+
// Check if action finished inside of the document
|
|
3698
3694
|
// if event prevented or it is current table don't clear focus
|
|
3699
|
-
|
|
3700
|
-
|
|
3695
|
+
const path = event.composedPath();
|
|
3696
|
+
if (!path.includes(this.element) &&
|
|
3697
|
+
!path.includes(this.element.shadowRoot)) {
|
|
3698
|
+
// Perform actions if the click is outside the component
|
|
3699
|
+
this.clearFocus();
|
|
3701
3700
|
}
|
|
3702
|
-
this.clearFocus();
|
|
3703
3701
|
}
|
|
3704
3702
|
// #endregion
|
|
3705
3703
|
// #region Listeners
|
|
@@ -3983,7 +3981,7 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
|
|
|
3983
3981
|
}
|
|
3984
3982
|
// register filter plugin
|
|
3985
3983
|
if (this.filter) {
|
|
3986
|
-
this.internalPlugins.push(new FilterPlugin(this.element, pluginData,
|
|
3984
|
+
this.internalPlugins.push(new FilterPlugin(this.element, pluginData, typeof this.filter === 'object' ? this.filter : undefined));
|
|
3987
3985
|
}
|
|
3988
3986
|
// register export plugin
|
|
3989
3987
|
if (this.exporting) {
|
|
@@ -4030,8 +4028,6 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
|
|
|
4030
4028
|
this.selectionStoreConnector = new SelectionStoreConnector();
|
|
4031
4029
|
this.dataProvider = new DataProvider(this.dimensionProvider);
|
|
4032
4030
|
// #endregion
|
|
4033
|
-
// generate uuid for this grid
|
|
4034
|
-
this.uuid = `rv--${Math.random().toString(36).slice(2, 6)}-${Date.now()}`;
|
|
4035
4031
|
this.registerOutsideVNodes(this.registerVNode);
|
|
4036
4032
|
// init plugins
|
|
4037
4033
|
this.setPlugins();
|
|
@@ -4102,7 +4098,7 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
|
|
|
4102
4098
|
const headerProperties = Object.assign(Object.assign({}, view.headerProp), { type: view.type, additionalData: this.additionalData, viewportCol: view.viewportCol, selectionStore: view.columnSelectionStore, canResize: this.resize, readonly: this.readonly, columnFilter: !!this.filter });
|
|
4103
4099
|
// Column headers
|
|
4104
4100
|
const dataViews = [
|
|
4105
|
-
h("revogr-header", Object.assign({ key: '
|
|
4101
|
+
h("revogr-header", Object.assign({ key: 'ff8eefd6db3baf494c015a2ea573160d27739aa9' }, headerProperties, { slot: HEADER_SLOT })),
|
|
4106
4102
|
];
|
|
4107
4103
|
// Render viewport data (vertical sections)
|
|
4108
4104
|
view.dataPorts.forEach(data => {
|
|
@@ -4124,11 +4120,11 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
|
|
|
4124
4120
|
const typeCol = 'rgCol';
|
|
4125
4121
|
const viewports = this.viewportProvider.stores;
|
|
4126
4122
|
const dimensions = this.dimensionProvider.stores;
|
|
4127
|
-
return (h(Host, { key: '
|
|
4123
|
+
return (h(Host, { key: '21bbe81595f20f7bcb271f28c9c86feef472efec' }, this.hideAttribution ? null : (h("revogr-attribution", { class: "attribution" })), h("div", { key: '7a3092cd02305a0dfaa3b3d3160164001f0ed08b', class: "main-viewport", onClick: (e) => {
|
|
4128
4124
|
if (e.currentTarget === e.target) {
|
|
4129
4125
|
this.viewport.clearEdit();
|
|
4130
4126
|
}
|
|
4131
|
-
} }, h("div", { key: '
|
|
4127
|
+
} }, h("div", { key: 'ae1dfccbb72cc2a9f7fa370889746c702d106045', class: "viewports" }, h("slot", { key: '0725b46d877fbb63fb513845cc1c7b86d0f856b8', name: "viewport" }), viewportSections, h("revogr-scroll-virtual", { key: 'd41771f6ff459f1f6747ce496c8165b1dab44963', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), h(OrderRenderer, { key: '2914421478450c9b198e0aade898ed342e4d7f6a', ref: e => (this.orderService = e) }))), h("revogr-scroll-virtual", { key: 'bc1812c5ce54cda01e81cc06e28c69dc8e36fdf3', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
|
|
4132
4128
|
}
|
|
4133
4129
|
disconnectedCallback() {
|
|
4134
4130
|
// Remove all plugins, to avoid memory leaks and unexpected behaviour when the component is removed
|