|
@@ -10,20 +10,32 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
|
-import { computed, defineComponent, onBeforeUnmount, onMounted, ref, toRefs, watch } from 'vue';
|
|
|
|
|
-import Handsontable from '@sc/handsontable';
|
|
|
|
|
-import { TreeNode } from '@sc/tree';
|
|
|
|
|
-import debounce from 'lodash/debounce';
|
|
|
|
|
-import { off } from '@/utils/frontend/dom';
|
|
|
|
|
-import useClickPosition from './composables/useClickPosition';
|
|
|
|
|
-import useInstance from './composables/useInstance';
|
|
|
|
|
-import useTableSettings, { getColumnsSettings, getTableData, overwriteReadOnly } from './composables/useTableSettings';
|
|
|
|
|
-import './renderer/registerRenderers';
|
|
|
|
|
-import { Hot } from '@/types/components';
|
|
|
|
|
|
|
+import {
|
|
|
|
|
+ computed,
|
|
|
|
|
+ defineComponent,
|
|
|
|
|
+ onBeforeUnmount,
|
|
|
|
|
+ onMounted,
|
|
|
|
|
+ ref,
|
|
|
|
|
+ toRefs,
|
|
|
|
|
+ watch,
|
|
|
|
|
+} from "vue";
|
|
|
|
|
+import Handsontable from "@sc/handsontable";
|
|
|
|
|
+import { TreeNode } from "@sc/tree";
|
|
|
|
|
+import debounce from "lodash/debounce";
|
|
|
|
|
+import { off } from "@/utils/frontend/dom";
|
|
|
|
|
+import useClickPosition from "./composables/useClickPosition";
|
|
|
|
|
+import useInstance from "./composables/useInstance";
|
|
|
|
|
+import useTableSettings, {
|
|
|
|
|
+ getColumnsSettings,
|
|
|
|
|
+ getTableData,
|
|
|
|
|
+ overwriteReadOnly,
|
|
|
|
|
+} from "./composables/useTableSettings";
|
|
|
|
|
+import "./renderer/registerRenderers";
|
|
|
|
|
+import { Hot } from "@/types/components/hot";
|
|
|
// import './cell-types/registerCellTypes';
|
|
// import './cell-types/registerCellTypes';
|
|
|
|
|
|
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
|
- name: 'Handsontable',
|
|
|
|
|
|
|
+ name: "Handsontable",
|
|
|
props: {
|
|
props: {
|
|
|
// 表格的数据
|
|
// 表格的数据
|
|
|
data: {
|
|
data: {
|
|
@@ -43,7 +55,7 @@ export default defineComponent({
|
|
|
// 边框, none 表示没有边框
|
|
// 边框, none 表示没有边框
|
|
|
border: {
|
|
border: {
|
|
|
type: String,
|
|
type: String,
|
|
|
- default: 'top,right,bottom,left',
|
|
|
|
|
|
|
+ default: "top,right,bottom,left",
|
|
|
},
|
|
},
|
|
|
// 整个表格是否只读
|
|
// 整个表格是否只读
|
|
|
readOnly: {
|
|
readOnly: {
|
|
@@ -70,15 +82,18 @@ export default defineComponent({
|
|
|
|
|
|
|
|
type RowHeaders = boolean | ((visualRow: number) => number);
|
|
type RowHeaders = boolean | ((visualRow: number) => number);
|
|
|
const getRowHeader = (): RowHeaders => {
|
|
const getRowHeader = (): RowHeaders => {
|
|
|
- if (tableSettings.rowHeaders !== undefined) return tableSettings.rowHeaders as any;
|
|
|
|
|
|
|
+ if (tableSettings.rowHeaders !== undefined)
|
|
|
|
|
+ return tableSettings.rowHeaders as any;
|
|
|
return props.tree
|
|
return props.tree
|
|
|
? (visualRow: number) => {
|
|
? (visualRow: number) => {
|
|
|
- if (instance) {
|
|
|
|
|
- const rowSourceData = instance.getSourceDataAtRow(instance.toPhysicalRow(visualRow)) as TreeNode;
|
|
|
|
|
- return rowSourceData.getCtx().row() + 1;
|
|
|
|
|
|
|
+ if (instance) {
|
|
|
|
|
+ const rowSourceData = instance.getSourceDataAtRow(
|
|
|
|
|
+ instance.toPhysicalRow(visualRow)
|
|
|
|
|
+ ) as TreeNode;
|
|
|
|
|
+ return rowSourceData.getCtx().row() + 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ return visualRow;
|
|
|
}
|
|
}
|
|
|
- return visualRow;
|
|
|
|
|
- }
|
|
|
|
|
: true;
|
|
: true;
|
|
|
};
|
|
};
|
|
|
// 重新渲染,供外界调用
|
|
// 重新渲染,供外界调用
|
|
@@ -104,7 +119,7 @@ export default defineComponent({
|
|
|
})();
|
|
})();
|
|
|
|
|
|
|
|
// 改变窗口大小监听事件
|
|
// 改变窗口大小监听事件
|
|
|
- window.addEventListener('resize', onResize);
|
|
|
|
|
|
|
+ window.addEventListener("resize", onResize);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const { readOnly, tree } = toRefs(props);
|
|
const { readOnly, tree } = toRefs(props);
|
|
@@ -146,7 +161,7 @@ export default defineComponent({
|
|
|
const { columnsMeta } = newSettings;
|
|
const { columnsMeta } = newSettings;
|
|
|
columnsMeta &&
|
|
columnsMeta &&
|
|
|
columnsMeta.forEach((columnMeta: any) => {
|
|
columnsMeta.forEach((columnMeta: any) => {
|
|
|
- if (columnMeta.renderer === 'wc.switcherRenderer') {
|
|
|
|
|
|
|
+ if (columnMeta.renderer === "wc.switcherRenderer") {
|
|
|
delete columnMeta.renderer;
|
|
delete columnMeta.renderer;
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
@@ -157,27 +172,28 @@ export default defineComponent({
|
|
|
// 组件 unmount 之前销毁 handsontable 实例
|
|
// 组件 unmount 之前销毁 handsontable 实例
|
|
|
onBeforeUnmount(() => {
|
|
onBeforeUnmount(() => {
|
|
|
if (instance) {
|
|
if (instance) {
|
|
|
- window.removeEventListener('resize', onResize);
|
|
|
|
|
|
|
+ window.removeEventListener("resize", onResize);
|
|
|
|
|
|
|
|
// 移除所有的监听器
|
|
// 移除所有的监听器
|
|
|
// Handsontable.hooks.destroy && Handsontable.hooks.destroy(instance);
|
|
// Handsontable.hooks.destroy && Handsontable.hooks.destroy(instance);
|
|
|
instance.destroy();
|
|
instance.destroy();
|
|
|
instance = null;
|
|
instance = null;
|
|
|
}
|
|
}
|
|
|
- if (clickPositionHandler) off(document.body, 'mouseup', clickPositionHandler);
|
|
|
|
|
|
|
+ if (clickPositionHandler)
|
|
|
|
|
+ off(document.body, "mouseup", clickPositionHandler);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// 边框样式
|
|
// 边框样式
|
|
|
const borderStyle = computed(() => {
|
|
const borderStyle = computed(() => {
|
|
|
- if (props.border === 'none') {
|
|
|
|
|
|
|
+ if (props.border === "none") {
|
|
|
return {
|
|
return {
|
|
|
- border: 'none',
|
|
|
|
|
|
|
+ border: "none",
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
- const borders = props.border.split(',');
|
|
|
|
|
|
|
+ const borders = props.border.split(",");
|
|
|
const style = {} as any;
|
|
const style = {} as any;
|
|
|
- borders.forEach(border => {
|
|
|
|
|
- style[`border-${border}`] = '1px solid #d4d4d4';
|
|
|
|
|
|
|
+ borders.forEach((border) => {
|
|
|
|
|
+ style[`border-${border}`] = "1px solid #d4d4d4";
|
|
|
});
|
|
});
|
|
|
return style;
|
|
return style;
|
|
|
});
|
|
});
|
|
@@ -207,11 +223,11 @@ export default defineComponent({
|
|
|
height: 100%;
|
|
height: 100%;
|
|
|
overflow: hidden;
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
- /* ::v-deep > .ht_master {
|
|
|
|
|
|
|
+ /* > :deep(.ht_master) {
|
|
|
} */
|
|
} */
|
|
|
|
|
|
|
|
- ::v-deep > .ht_clone_top_left_corner,
|
|
|
|
|
- ::v-deep > .ht_clone_top {
|
|
|
|
|
|
|
+ > :deep(.ht_clone_top_left_corner),
|
|
|
|
|
+ > :deep(.ht_clone_top) {
|
|
|
.htCore {
|
|
.htCore {
|
|
|
.real-th {
|
|
.real-th {
|
|
|
position: relative;
|
|
position: relative;
|
|
@@ -239,10 +255,10 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /* ::v-deep > .ht_clone_bottom {
|
|
|
|
|
|
|
+ /* > :deep(.ht_clone_bottom) {
|
|
|
} */
|
|
} */
|
|
|
|
|
|
|
|
- ::v-deep > .ht_clone_left {
|
|
|
|
|
|
|
+ > :deep(.ht_clone_left) {
|
|
|
// overflow: visible !important;
|
|
// overflow: visible !important;
|
|
|
|
|
|
|
|
.wtHolder {
|
|
.wtHolder {
|
|
@@ -267,7 +283,7 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- ::v-deep > .ht_clone_top_left_corner {
|
|
|
|
|
|
|
+ > :deep(.ht_clone_top_left_corner) {
|
|
|
.htCore {
|
|
.htCore {
|
|
|
thead {
|
|
thead {
|
|
|
tr {
|
|
tr {
|
|
@@ -279,15 +295,15 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /* ::v-deep > .handsontableInputHolder {
|
|
|
|
|
|
|
+ /* :deep( > .handsontableInputHolder){
|
|
|
}
|
|
}
|
|
|
*/
|
|
*/
|
|
|
- ::v-deep > .ht_master,
|
|
|
|
|
- ::v-deep > .ht_clone_top,
|
|
|
|
|
- ::v-deep > .ht_clone_bottom,
|
|
|
|
|
- ::v-deep > .ht_clone_left,
|
|
|
|
|
- ::v-deep > .ht_clone_top_left_corner,
|
|
|
|
|
- ::v-deep > .handsontableInputHolder {
|
|
|
|
|
|
|
+ > :deep(.ht_master),
|
|
|
|
|
+ > :deep(.ht_clone_top),
|
|
|
|
|
+ > :deep(.ht_clone_bottom),
|
|
|
|
|
+ > :deep(.ht_clone_left),
|
|
|
|
|
+ > :deep(.ht_clone_top_left_corner),
|
|
|
|
|
+ > :deep(.handsontableInputHolder) {
|
|
|
.htCore {
|
|
.htCore {
|
|
|
td,
|
|
td,
|
|
|
th {
|
|
th {
|
|
@@ -295,9 +311,11 @@ export default defineComponent({
|
|
|
&.current-row {
|
|
&.current-row {
|
|
|
background-color: $light-sky-blue !important;
|
|
background-color: $light-sky-blue !important;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
&.show-highlight {
|
|
&.show-highlight {
|
|
|
background-color: #c1e1fc !important;
|
|
background-color: #c1e1fc !important;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
// 当前选中单元格的样式
|
|
// 当前选中单元格的样式
|
|
|
&.current {
|
|
&.current {
|
|
|
&.highlight {
|
|
&.highlight {
|
|
@@ -374,7 +392,7 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 没有左边框
|
|
// 没有左边框
|
|
|
- ::v-deep > .ht_clone_left {
|
|
|
|
|
|
|
+ > :deep(.ht_clone_left) {
|
|
|
.htCore {
|
|
.htCore {
|
|
|
th {
|
|
th {
|
|
|
border-left: none;
|
|
border-left: none;
|
|
@@ -382,7 +400,7 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- ::v-deep > .ht_clone_top_left_corner {
|
|
|
|
|
|
|
+ > :deep(.ht_clone_top_left_corner) {
|
|
|
.htCore {
|
|
.htCore {
|
|
|
thead {
|
|
thead {
|
|
|
th:first-child {
|
|
th:first-child {
|
|
@@ -393,12 +411,12 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 没有上边框
|
|
// 没有上边框
|
|
|
- ::v-deep > .ht_master,
|
|
|
|
|
- ::v-deep > .ht_clone_top,
|
|
|
|
|
- ::v-deep > .ht_clone_bottom,
|
|
|
|
|
- ::v-deep > .ht_clone_left,
|
|
|
|
|
- ::v-deep > .ht_clone_top_left_corner,
|
|
|
|
|
- ::v-deep > .handsontableInputHolder {
|
|
|
|
|
|
|
+ > :deep(.ht_master),
|
|
|
|
|
+ > :deep(.ht_clone_top),
|
|
|
|
|
+ > :deep(.ht_clone_bottom),
|
|
|
|
|
+ > :deep(.ht_clone_left),
|
|
|
|
|
+ > :deep(.ht_clone_top_left_corner),
|
|
|
|
|
+ > :deep(.handsontableInputHolder) {
|
|
|
.htCore {
|
|
.htCore {
|
|
|
thead {
|
|
thead {
|
|
|
tr {
|
|
tr {
|
|
@@ -407,6 +425,7 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
/*tbody {
|
|
/*tbody {
|
|
|
tr {
|
|
tr {
|
|
|
td {
|
|
td {
|
|
@@ -417,14 +436,15 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- ::v-deep .red {
|
|
|
|
|
|
|
+ :deep(.red) {
|
|
|
color: red !important;
|
|
color: red !important;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- ::v-deep .green {
|
|
|
|
|
|
|
+ :deep(.green) {
|
|
|
color: green !important;
|
|
color: green !important;
|
|
|
}
|
|
}
|
|
|
- ::v-deep .stateCheckBox::after {
|
|
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.stateCheckBox::after) {
|
|
|
content: "";
|
|
content: "";
|
|
|
display: block;
|
|
display: block;
|
|
|
width: 7px;
|
|
width: 7px;
|
|
@@ -434,13 +454,13 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 调整列大小的手柄
|
|
// 调整列大小的手柄
|
|
|
- ::v-deep .manualColumnResizer {
|
|
|
|
|
|
|
+ :deep(.manualColumnResizer) {
|
|
|
cursor: ew-resize;
|
|
cursor: ew-resize;
|
|
|
transform: translateX(3px);
|
|
transform: translateX(3px);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 调整行大小的手柄
|
|
// 调整行大小的手柄
|
|
|
- ::v-deep .manualRowResizer {
|
|
|
|
|
|
|
+ :deep(.manualRowResizer) {
|
|
|
cursor: ns-resize;
|
|
cursor: ns-resize;
|
|
|
transform: translateY(3px);
|
|
transform: translateY(3px);
|
|
|
}
|
|
}
|