vue2-excel-grid 2.8.9 → 2.10.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-excel-grid",
3
- "version": "2.8.9",
3
+ "version": "2.10.0",
4
4
  "description": "Excel-style grid component for Vue 2.6.14 with virtual scrolling",
5
5
  "license": "MIT",
6
6
  "author": "Fozilbek Raimberdiyev",
@@ -60,6 +60,9 @@
60
60
  <div v-if="clearable && selectedOpt" class="eg-select-footer">
61
61
  <button class="eg-select-btn eg-select-btn--clear" tabindex="-1" @mousedown.prevent="pickClear">{{ t.clear }}</button>
62
62
  </div>
63
+ <div v-if="$slots['dropdown-footer']" class="eg-select-dropdown-footer">
64
+ <slot name="dropdown-footer"></slot>
65
+ </div>
63
66
  </template>
64
67
 
65
68
  <!-- Options panel in standalone mode (floating dropdown below trigger) -->
@@ -103,6 +106,9 @@
103
106
  <div v-if="clearable && selectedOpt" class="eg-select-footer">
104
107
  <button class="eg-select-btn eg-select-btn--clear" tabindex="-1" @mousedown.prevent="pickClear">{{ t.clear }}</button>
105
108
  </div>
109
+ <div v-if="$slots['dropdown-footer']" class="eg-select-dropdown-footer">
110
+ <slot name="dropdown-footer"></slot>
111
+ </div>
106
112
  </div>
107
113
 
108
114
  <div v-if="hoverTooltip" class="eg-option-tooltip" :style="hoverTooltipStyle">{{ hoverTooltip.text }}</div>
@@ -557,6 +563,10 @@ export default {
557
563
  padding: 4px 6px 6px;
558
564
  border-top: 1px solid var(--eg-color-border, var(--eg-color-border-default));
559
565
  }
566
+ .eg-select-dropdown-footer {
567
+ border-top: 1px solid var(--eg-color-border, var(--eg-color-border-default));
568
+ padding: 4px;
569
+ }
560
570
  .eg-select-btn {
561
571
  background: none;
562
572
  border: 1px solid var(--eg-color-border, var(--eg-color-border-default));
@@ -66,6 +66,9 @@
66
66
  <div v-if="clearable && selectedLabel != null" class="eg-select-footer">
67
67
  <button class="eg-select-btn eg-select-btn--clear" tabindex="-1" @mousedown.prevent="pickClear">{{ t.clear }}</button>
68
68
  </div>
69
+ <div v-if="$slots['dropdown-footer']" class="eg-select-dropdown-footer">
70
+ <slot name="dropdown-footer"></slot>
71
+ </div>
69
72
  </template>
70
73
 
71
74
  <!-- Options panel in standalone mode -->
@@ -116,6 +119,9 @@
116
119
  <div v-if="clearable && selectedLabel != null" class="eg-select-footer">
117
120
  <button class="eg-select-btn eg-select-btn--clear" tabindex="-1" @mousedown.prevent="pickClear">{{ t.clear }}</button>
118
121
  </div>
122
+ <div v-if="$slots['dropdown-footer']" class="eg-select-dropdown-footer">
123
+ <slot name="dropdown-footer"></slot>
124
+ </div>
119
125
  </div>
120
126
 
121
127
  <div v-if="hoverTooltip" class="eg-option-tooltip" :style="hoverTooltipStyle">{{ hoverTooltip.text }}</div>
@@ -97,6 +97,7 @@
97
97
  <option value="antd">Ant Design</option>
98
98
  <option value="fluent">Fluent</option>
99
99
  <option value="carbon">Carbon</option>
100
+ <option value="polaris">Shopify Polaris</option>
100
101
  </select>
101
102
  </div>
102
103
 
@@ -244,8 +245,8 @@
244
245
  class="eg-header-cell"
245
246
  :class="[
246
247
  { 'eg-header-group': cell.isGroup, 'eg-header-cell--drag-source': colDrag.active && cell._firstLeafFlatIndex >= colDrag.sourceFirstLeaf && cell._firstLeafFlatIndex < colDrag.sourceFirstLeaf + colDrag.sourceLeafCount },
247
- cell.column && cell.column.overflowTitle === 'truncate' ? 'eg-header-cell--truncate' : '',
248
- cell.column && cell.column.overflowTitle === 'wrap' ? 'eg-header-cell--wrap' : ''
248
+ cell.column && (cell.column.overflowTitle || overflowTitle) === 'truncate' ? 'eg-header-cell--truncate' : '',
249
+ cell.column && (cell.column.overflowTitle || overflowTitle) === 'wrap' ? 'eg-header-cell--wrap' : ''
249
250
  ]"
250
251
  :data-fi="!cell.isGroup ? cell.column._flatIndex : undefined"
251
252
  :data-start="cell.isGroup ? cell._firstLeafFlatIndex : undefined"
@@ -254,7 +255,7 @@
254
255
  @mousedown="onColHeaderMouseDown($event, cell)"
255
256
  @dblclick="onColHeaderDblClick($event, cell)"
256
257
  @contextmenu.prevent="onColHeaderContextMenu($event, cell)"
257
- @mouseenter="cell.column && cell.column.overflowTitle === 'truncate' ? _showTooltip(cell.column.title, $event.currentTarget) : null"
258
+ @mouseenter="cell.column && (cell.column.overflowTitle || overflowTitle) === 'truncate' ? _showTooltip(cell.column.title, $event.currentTarget) : null"
258
259
  @mouseleave="_hideTooltip"
259
260
  >
260
261
  <span class="eg-header-title">
@@ -342,8 +343,8 @@
342
343
  class="eg-header-cell"
343
344
  :class="[
344
345
  { 'eg-header-group': cell.isGroup, 'eg-header-cell--drag-source': colDrag.active && cell._firstLeafFlatIndex >= colDrag.sourceFirstLeaf && cell._firstLeafFlatIndex < colDrag.sourceFirstLeaf + colDrag.sourceLeafCount },
345
- cell.column && cell.column.overflowTitle === 'truncate' ? 'eg-header-cell--truncate' : '',
346
- cell.column && cell.column.overflowTitle === 'wrap' ? 'eg-header-cell--wrap' : ''
346
+ cell.column && (cell.column.overflowTitle || overflowTitle) === 'truncate' ? 'eg-header-cell--truncate' : '',
347
+ cell.column && (cell.column.overflowTitle || overflowTitle) === 'wrap' ? 'eg-header-cell--wrap' : ''
347
348
  ]"
348
349
  :data-fi="!cell.isGroup ? cell.column._flatIndex : undefined"
349
350
  :data-start="cell.isGroup ? cell._firstLeafFlatIndex : undefined"
@@ -352,7 +353,7 @@
352
353
  @mousedown="onColHeaderMouseDown($event, cell)"
353
354
  @dblclick="onColHeaderDblClick($event, cell)"
354
355
  @contextmenu.prevent="onColHeaderContextMenu($event, cell)"
355
- @mouseenter="cell.column && cell.column.overflowTitle === 'truncate' ? _showTooltip(cell.column.title, $event.currentTarget) : null"
356
+ @mouseenter="cell.column && (cell.column.overflowTitle || overflowTitle) === 'truncate' ? _showTooltip(cell.column.title, $event.currentTarget) : null"
356
357
  @mouseleave="_hideTooltip"
357
358
  >
358
359
  <span class="eg-header-title">
@@ -437,8 +438,8 @@
437
438
  class="eg-header-cell"
438
439
  :class="[
439
440
  { 'eg-header-group': cell.isGroup, 'eg-header-cell--drag-source': colDrag.active && cell._firstLeafFlatIndex >= colDrag.sourceFirstLeaf && cell._firstLeafFlatIndex < colDrag.sourceFirstLeaf + colDrag.sourceLeafCount },
440
- cell.column && cell.column.overflowTitle === 'truncate' ? 'eg-header-cell--truncate' : '',
441
- cell.column && cell.column.overflowTitle === 'wrap' ? 'eg-header-cell--wrap' : ''
441
+ cell.column && (cell.column.overflowTitle || overflowTitle) === 'truncate' ? 'eg-header-cell--truncate' : '',
442
+ cell.column && (cell.column.overflowTitle || overflowTitle) === 'wrap' ? 'eg-header-cell--wrap' : ''
442
443
  ]"
443
444
  :data-fi="!cell.isGroup ? cell.column._flatIndex : undefined"
444
445
  :data-start="cell.isGroup ? cell._firstLeafFlatIndex : undefined"
@@ -447,7 +448,7 @@
447
448
  @mousedown="onColHeaderMouseDown($event, cell)"
448
449
  @dblclick="onColHeaderDblClick($event, cell)"
449
450
  @contextmenu.prevent="onColHeaderContextMenu($event, cell)"
450
- @mouseenter="cell.column && cell.column.overflowTitle === 'truncate' ? _showTooltip(cell.column.title, $event.currentTarget) : null"
451
+ @mouseenter="cell.column && (cell.column.overflowTitle || overflowTitle) === 'truncate' ? _showTooltip(cell.column.title, $event.currentTarget) : null"
451
452
  @mouseleave="_hideTooltip"
452
453
  >
453
454
  <span class="eg-header-title">
@@ -917,7 +918,11 @@
917
918
  :clearable="selectDropdown.clearable"
918
919
  @select="onComponentSelect"
919
920
  @close="closeSelectDropdown"
920
- />
921
+ >
922
+ <template #dropdown-footer>
923
+ <slot :name="'dropdown-footer-' + selectDropdown.col.key" :column="selectDropdown.col" :close="closeSelectDropdown"></slot>
924
+ </template>
925
+ </eg-select>
921
926
  <!-- Tree select dropdown overlay -->
922
927
  <eg-tree-select
923
928
  v-if="selectDropdown && selectDropdown.tree"
@@ -935,7 +940,11 @@
935
940
  :clearable="selectDropdown.clearable"
936
941
  @select="onComponentSelect"
937
942
  @close="closeSelectDropdown"
938
- />
943
+ >
944
+ <template #dropdown-footer>
945
+ <slot :name="'dropdown-footer-' + selectDropdown.col.key" :column="selectDropdown.col" :close="closeSelectDropdown"></slot>
946
+ </template>
947
+ </eg-tree-select>
939
948
 
940
949
  <!-- Date picker overlay -->
941
950
  <eg-date-picker
@@ -1051,7 +1060,7 @@ const DEFAULT_TOOLBAR_LIST = ['undoRedo', 'export', 'import', 'print', 'localSyn
1051
1060
  // retarget smoothly from whatever intermediate position an element is currently
1052
1061
  // at when the drop slot changes mid-flight — no JS animation library races.
1053
1062
  const COL_DRAG_TRANSITION = 'transform 200ms cubic-bezier(0.2, 0, 0, 1)'
1054
- const THEME_LIST = ['excel', 'material', 'antd', 'fluent', 'carbon']
1063
+ const THEME_LIST = ['excel', 'material', 'antd', 'fluent', 'carbon', 'polaris']
1055
1064
 
1056
1065
  // Kept as a named const (rather than an inline `export default {}`) so the
1057
1066
  // local-sync preview modal can receive the plain component definition
@@ -1072,6 +1081,19 @@ const ExcelGridComponent = {
1072
1081
  /** Array of row objects keyed by columns[].key */
1073
1082
  data: { type: Array, default: () => [] },
1074
1083
 
1084
+ /**
1085
+ * Sarlavhalardagi matn sig'may qolganda uning qanday harakatlanishini belgilaydi
1086
+ * (barcha ustunlar uchun umumiy qoida). Ustun (column) sozlamalarida
1087
+ * xuddi shu nomli xususiyat mavjud bo'lsa, ustun sozlamasi inobatga olinadi.
1088
+ * @type {String}
1089
+ * @default 'no-overflow'
1090
+ */
1091
+ overflowTitle: {
1092
+ type: String,
1093
+ default: 'no-overflow',
1094
+ validator: v => ['no-overflow', 'truncate', 'wrap'].includes(v)
1095
+ },
1096
+
1075
1097
  /**
1076
1098
  * Column definitions (may be nested via children[]).
1077
1099
  *
@@ -1443,7 +1465,7 @@ const ExcelGridComponent = {
1443
1465
 
1444
1466
  /**
1445
1467
  * Visual theme of the grid.
1446
- * Built-in: 'excel' | 'material' | 'antd' | 'fluent' | 'carbon'
1468
+ * Built-in: 'excel' | 'material' | 'antd' | 'fluent' | 'carbon' | 'polaris'
1447
1469
  * Default is the classic Excel 365 look. Use 'material' for Material Design 3.
1448
1470
  * Mirrors the `size` prop's convention: an internal `internalTheme` state
1449
1471
  * mirrors this prop and is what the toolbar's theme picker actually reads
@@ -2842,7 +2864,7 @@ const ExcelGridComponent = {
2842
2864
  },
2843
2865
  _calcHeaderHeight() {
2844
2866
  if (!this.leafCols) return
2845
- const wrapCols = this.leafCols.filter(c => c.overflowTitle === 'wrap')
2867
+ const wrapCols = this.leafCols.filter(c => (c.overflowTitle || this.overflowTitle) === 'wrap')
2846
2868
  if (wrapCols.length === 0) {
2847
2869
  if (this.calculatedHeaderHeight !== null) this.calculatedHeaderHeight = null
2848
2870
  return
@@ -7620,6 +7642,62 @@ export default ExcelGridComponent
7620
7642
  --eg-color-row-stripe-default: #F4F4F4;
7621
7643
  }
7622
7644
 
7645
+ /* ── Shopify Polaris — toza, zamonaviy e-commerce uslubi, 8px radius ── */
7646
+ .eg-shell.eg-theme-polaris {
7647
+ --eg-font-family-default: -apple-system, BlinkMacSystemFont, 'San Francisco', 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
7648
+ --eg-font-size-default: 13px;
7649
+ --eg-font-size-header-default: 12px;
7650
+ --eg-radius-default: 8px;
7651
+ --eg-cell-padding-x-default: 8px;
7652
+
7653
+ --eg-color-accent-default: #008060;
7654
+ --eg-color-accent-dark-default: #004c3f;
7655
+ --eg-color-accent-soft-default: #E3F1DF;
7656
+
7657
+ --eg-color-error-default: #D72C0D;
7658
+ --eg-color-error-soft-default: #FFF4F4;
7659
+ --eg-color-error-dark-default: #8C1000;
7660
+
7661
+ /* Polaris borderlar: yumshoq kulrang */
7662
+ --eg-color-border-default: #D2D5D8;
7663
+ --eg-color-border-cell-default: #E1E3E5;
7664
+ --eg-color-border-strong-default: #8C9196;
7665
+
7666
+ /* Polaris header: yengil neytral kulrang (#F6F6F7) */
7667
+ --eg-color-header-bg-default: #F6F6F7;
7668
+ --eg-color-header-group-bg-default: #EDEEEF;
7669
+ --eg-color-group-border-default: #008060;
7670
+ --eg-color-group-bg-collapsed-default: #004c3f;
7671
+
7672
+ --eg-color-cell-bg-default: #FFFFFF;
7673
+ --eg-color-cell-selected-default: #E3F1DF;
7674
+ --eg-color-cell-fill-preview-default: #BBE5B3;
7675
+ --eg-color-cell-readonly-default: #FAFBFB;
7676
+ --eg-color-cell-readonly-selected-default: #D8ECE5;
7677
+ --eg-color-cell-readonly-pattern-default: rgba(0, 128, 96, 0.05);
7678
+ --eg-color-footer-bg-default: #F6F6F7;
7679
+
7680
+ --eg-color-text-default: #202223;
7681
+ --eg-color-text-secondary-default: #6D7175;
7682
+ --eg-color-text-muted-default: #8C9196;
7683
+
7684
+ --eg-shadow-dropdown-default: 0 4px 12px rgba(0, 0, 0, 0.08), 0 1px 3px rgba(0, 0, 0, 0.05);
7685
+ --eg-shadow-dialog-default: 0 8px 24px rgba(0, 0, 0, 0.12);
7686
+ --eg-shadow-tooltip-default: 0 2px 6px rgba(0, 0, 0, 0.15);
7687
+ --eg-color-freeze-shadow-default: rgba(0, 0, 0, 0.08);
7688
+
7689
+ --eg-color-overlay-bg-default: rgba(255, 255, 255, 0.94);
7690
+ --eg-color-option-hover-bg-default: #F6F6F7;
7691
+ --eg-color-option-active-hover-bg-default: #E3F1DF;
7692
+
7693
+ --eg-color-checkbox-border-default: #8C9196;
7694
+ --eg-color-checkbox-disabled-checked-default: #C9CCCF;
7695
+
7696
+ /* Polaris hover va stripe */
7697
+ --eg-color-row-hover-default: #F1F2F4;
7698
+ --eg-color-row-stripe-default: #FAFBFB;
7699
+ }
7700
+
7623
7701
  .eg-wrapper {
7624
7702
  display: flex;
7625
7703
  flex-direction: column;
@@ -8901,6 +8979,10 @@ export default ExcelGridComponent
8901
8979
  padding: 4px 6px 6px;
8902
8980
  border-top: 1px solid var(--eg-color-border, var(--eg-color-border-default));
8903
8981
  }
8982
+ .eg-select-dropdown-footer {
8983
+ border-top: 1px solid var(--eg-color-border, var(--eg-color-border-default));
8984
+ padding: 4px;
8985
+ }
8904
8986
  .eg-select-btn {
8905
8987
  background: none;
8906
8988
  border: 1px solid var(--eg-color-border, var(--eg-color-border-default));
package/src/index.js CHANGED
@@ -8,7 +8,19 @@ export { ExcelGrid, EgCheckbox, EgSelect, EgTreeSelect, version }
8
8
 
9
9
  export default {
10
10
  version,
11
- install(Vue) {
11
+ install(Vue, options = {}) {
12
+ if (options && typeof options === 'object') {
13
+ Object.keys(options).forEach(key => {
14
+ if (ExcelGrid.props && ExcelGrid.props[key] !== undefined) {
15
+ const val = options[key]
16
+ if (typeof ExcelGrid.props[key] !== 'object') {
17
+ // Convert to object notation if it was just a constructor like `props: { fitColumns: Boolean }`
18
+ ExcelGrid.props[key] = { type: ExcelGrid.props[key] }
19
+ }
20
+ ExcelGrid.props[key].default = (val !== null && typeof val === 'object') ? () => val : val
21
+ }
22
+ })
23
+ }
12
24
  Vue.component('Vue2ExcelGrid', ExcelGrid)
13
25
  Vue.component('Vue2EgCheckbox', EgCheckbox)
14
26
  Vue.component('Vue2EgSelect', EgSelect)