style(components): canonical code
@ -1,10 +0,0 @@
|
|||||||
import { App } from "vue"
|
|
||||||
import breadCrumb from "./src/BreadCrumb.vue"
|
|
||||||
|
|
||||||
export const BreadCrumb = Object.assign(breadCrumb, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(breadCrumb.name, breadCrumb)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default BreadCrumb
|
|
@ -1,10 +0,0 @@
|
|||||||
import { App } from "vue"
|
|
||||||
import cropper from "./src/Cropper"
|
|
||||||
|
|
||||||
export const Cropper = Object.assign(cropper, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(cropper.name, cropper)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default Cropper
|
|
@ -1,131 +0,0 @@
|
|||||||
/**
|
|
||||||
<template>
|
|
||||||
<div :class="$attrs.class" :style="getWrapperStyle">
|
|
||||||
<img
|
|
||||||
v-show="isReady"
|
|
||||||
ref="imgElRef"
|
|
||||||
:src="src"
|
|
||||||
:alt="alt"
|
|
||||||
:crossorigin="crossorigin"
|
|
||||||
:style="getImageStyle"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script lang="ts">
|
|
||||||
import type { CSSProperties } from 'vue';
|
|
||||||
|
|
||||||
import { defineComponent, onMounted, ref, unref, computed, PropType } from 'vue';
|
|
||||||
|
|
||||||
import Cropper from 'cropperjs';
|
|
||||||
import 'cropperjs/dist/cropper.css';
|
|
||||||
|
|
||||||
type Options = Cropper.Options;
|
|
||||||
|
|
||||||
const defaultOptions: Cropper.Options = {
|
|
||||||
aspectRatio: 16 / 9,
|
|
||||||
zoomable: true,
|
|
||||||
zoomOnTouch: true,
|
|
||||||
zoomOnWheel: true,
|
|
||||||
cropBoxMovable: true,
|
|
||||||
cropBoxResizable: true,
|
|
||||||
toggleDragModeOnDblclick: true,
|
|
||||||
autoCrop: true,
|
|
||||||
background: true,
|
|
||||||
highlight: true,
|
|
||||||
center: true,
|
|
||||||
responsive: true,
|
|
||||||
restore: true,
|
|
||||||
checkCrossOrigin: true,
|
|
||||||
checkOrientation: true,
|
|
||||||
scalable: true,
|
|
||||||
modal: true,
|
|
||||||
guides: true,
|
|
||||||
movable: true,
|
|
||||||
rotatable: true,
|
|
||||||
};
|
|
||||||
export default defineComponent({
|
|
||||||
name: "Cropper",
|
|
||||||
props: {
|
|
||||||
src: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
alt: {
|
|
||||||
type: String,
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: [String, Number],
|
|
||||||
default: '360px',
|
|
||||||
},
|
|
||||||
crossorigin: {
|
|
||||||
type: String,
|
|
||||||
default: undefined,
|
|
||||||
},
|
|
||||||
imageStyle: {
|
|
||||||
type: Object as PropType<CSSProperties>,
|
|
||||||
default: {},
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
type: Object as PropType<Options>,
|
|
||||||
default: {},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
setup(props, ctx) {
|
|
||||||
const imgElRef = ref<ElRef<HTMLImageElement>>(null);
|
|
||||||
const cropper: any = ref<Nullable<Cropper>>(null);
|
|
||||||
|
|
||||||
const isReady = ref(false);
|
|
||||||
|
|
||||||
const getImageStyle = computed(
|
|
||||||
(): CSSProperties => {
|
|
||||||
return {
|
|
||||||
height: props.height,
|
|
||||||
maxWidth: '100%',
|
|
||||||
...props.imageStyle,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const getWrapperStyle = computed(
|
|
||||||
(): CSSProperties => {
|
|
||||||
const { height } = props;
|
|
||||||
return { height: `${height}`.replace(/px/, '') + 'px' };
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
async function init() {
|
|
||||||
const imgEl = unref(imgElRef);
|
|
||||||
if (!imgEl) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cropper.value = new Cropper(imgEl, {
|
|
||||||
...defaultOptions,
|
|
||||||
ready: () => {
|
|
||||||
isReady.value = true;
|
|
||||||
},
|
|
||||||
...props.options,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// event: return base64 and width and height information after cropping
|
|
||||||
const croppered = (): void => {
|
|
||||||
let imgInfo = cropper.value.getData();
|
|
||||||
cropper.value.getCroppedCanvas().toBlob(blob => {
|
|
||||||
let fileReader: FileReader = new FileReader()
|
|
||||||
fileReader.onloadend = (e: any) => {
|
|
||||||
ctx.emit("cropperedInfo", {
|
|
||||||
imgBase64: e.target.result,
|
|
||||||
imgInfo
|
|
||||||
})
|
|
||||||
}
|
|
||||||
fileReader.readAsDataURL(blob)
|
|
||||||
}, 'image/jpeg')
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(init);
|
|
||||||
|
|
||||||
return { imgElRef, getWrapperStyle, getImageStyle, isReady, croppered };
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
*/
|
|
@ -1,10 +0,0 @@
|
|||||||
import { App } from "vue"
|
|
||||||
import flop from "./src/index.vue"
|
|
||||||
|
|
||||||
export const Flop = Object.assign(flop, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(flop.name, flop)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default Flop
|
|
@ -1,22 +0,0 @@
|
|||||||
import { App } from "vue"
|
|
||||||
import control from "./src/Control.vue"
|
|
||||||
import nodePanel from "./src/NodePanel.vue"
|
|
||||||
import dataDialog from "./src/DataDialog.vue"
|
|
||||||
|
|
||||||
export const Control = Object.assign(control, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(control.name, control)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export const NodePanel = Object.assign(nodePanel, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(nodePanel.name, nodePanel)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export const DataDialog = Object.assign(dataDialog, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(dataDialog.name, dataDialog)
|
|
||||||
}
|
|
||||||
})
|
|
@ -1,10 +0,0 @@
|
|||||||
import { App } from "vue"
|
|
||||||
import hamBurger from "./src/HamBurger.vue"
|
|
||||||
|
|
||||||
export const HamBurger = Object.assign(hamBurger, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(hamBurger.name, hamBurger)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default HamBurger
|
|
10
src/components/ReBreadCrumb/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import reBreadCrumb from "./src/index.vue";
|
||||||
|
|
||||||
|
export const ReBreadCrumb = Object.assign(reBreadCrumb, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(reBreadCrumb.name, reBreadCrumb);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ReBreadCrumb;
|
@ -22,7 +22,7 @@ import { ref, defineComponent, watch, Ref } from "vue";
|
|||||||
import { useRoute, useRouter, RouteLocationMatched } from "vue-router";
|
import { useRoute, useRouter, RouteLocationMatched } from "vue-router";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "BreadCrumb",
|
name: "ReBreadCrumb",
|
||||||
setup() {
|
setup() {
|
||||||
const levelList: Ref<RouteLocationMatched[]> = ref([]);
|
const levelList: Ref<RouteLocationMatched[]> = ref([]);
|
||||||
const route = useRoute();
|
const route = useRoute();
|
10
src/components/ReCountTo/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import reCountTo from "./src";
|
||||||
|
|
||||||
|
export const ReCountTo = Object.assign(reCountTo, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(reCountTo.name, reCountTo);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ReCountTo;
|
10
src/components/ReCropper/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import reCropper from "./src";
|
||||||
|
|
||||||
|
export const ReCropper = Object.assign(reCropper, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(reCropper.name, reCropper);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ReCropper;
|
@ -11,7 +11,6 @@ import {
|
|||||||
} from "vue";
|
} from "vue";
|
||||||
import { templateRef } from "@vueuse/core";
|
import { templateRef } from "@vueuse/core";
|
||||||
import { useAttrs } from "/@/utils/useAttrs";
|
import { useAttrs } from "/@/utils/useAttrs";
|
||||||
import { emitter } from "/@/utils/mitt";
|
|
||||||
|
|
||||||
import Cropper from "cropperjs";
|
import Cropper from "cropperjs";
|
||||||
import "cropperjs/dist/cropper.css";
|
import "cropperjs/dist/cropper.css";
|
||||||
@ -40,6 +39,7 @@ const defaultOptions: Cropper.Options = {
|
|||||||
movable: true,
|
movable: true,
|
||||||
rotatable: true,
|
rotatable: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "Cropper",
|
name: "Cropper",
|
||||||
props: {
|
props: {
|
||||||
@ -73,7 +73,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const cropper: any = ref<Nullable<Cropper>>(null);
|
const cropper: any = ref<Nullable<Cropper>>(null);
|
||||||
const imgElRef = templateRef<HTMLElement | null>("imgElRef", null);
|
const imgElRef = templateRef<HTMLImageElement | null>("imgElRef", null);
|
||||||
|
|
||||||
const isReady = ref(false);
|
const isReady = ref(false);
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
async function init() {
|
function init() {
|
||||||
const imgEl = unref(imgElRef);
|
const imgEl = unref(imgElRef);
|
||||||
if (!imgEl) {
|
if (!imgEl) {
|
||||||
return;
|
return;
|
||||||
@ -115,23 +115,31 @@ export default defineComponent({
|
|||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
init();
|
init();
|
||||||
// tsx语法返回渲染模板,外部组件想调用内部方法或者获取setup里面的实例,暂时想到的办法是通过公共事件
|
|
||||||
emitter.emit("cropperInstance", unref(cropper));
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return () => (
|
return {
|
||||||
|
props,
|
||||||
|
imgElRef,
|
||||||
|
cropper,
|
||||||
|
getWrapperStyle,
|
||||||
|
getImageStyle,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
<>
|
<>
|
||||||
<div
|
<div
|
||||||
class={useAttrs({ excludeListeners: true, excludeKeys: ["class"] })}
|
class={useAttrs({ excludeListeners: true, excludeKeys: ["class"] })}
|
||||||
style={unref(getWrapperStyle)}
|
style={this.getWrapperStyle}
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
ref="imgElRef"
|
ref="imgElRef"
|
||||||
src={props.src}
|
src={this.props.src}
|
||||||
alt={props.alt}
|
alt={this.props.alt}
|
||||||
crossorigin={props.crossorigin}
|
crossorigin={this.props.crossorigin}
|
||||||
style={unref(getImageStyle)}
|
style={this.getImageStyle}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
10
src/components/ReFlop/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import reFlop from "./src/index.vue";
|
||||||
|
|
||||||
|
export const ReFlop = Object.assign(reFlop, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(reFlop.name, reFlop);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ReFlop;
|
95
src/components/ReFlop/src/Filpper.tsx
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import { defineComponent, ref } from "vue";
|
||||||
|
import { propTypes } from "/@/utils/propTypes";
|
||||||
|
import "./filpper.css";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "Filpper",
|
||||||
|
props: {
|
||||||
|
// front paper text
|
||||||
|
// 前牌文字
|
||||||
|
frontText: propTypes.number.def(0),
|
||||||
|
// back paper text
|
||||||
|
// 后牌文字
|
||||||
|
backText: propTypes.number.def(1),
|
||||||
|
// flipping duration, please be consistent with the CSS animation-duration value.
|
||||||
|
// 翻牌动画时间,与CSS中设置的animation-duration保持一致
|
||||||
|
duration: propTypes.number.def(600),
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const { frontText, backText, duration } = props;
|
||||||
|
let isFlipping = ref(false);
|
||||||
|
let flipType = ref("down");
|
||||||
|
let frontTextFromData = ref(frontText);
|
||||||
|
let backTextFromData = ref(backText);
|
||||||
|
|
||||||
|
const textClass = (number: number) => {
|
||||||
|
return "number" + number;
|
||||||
|
};
|
||||||
|
|
||||||
|
const flip = (type: string, front: number, back: number) => {
|
||||||
|
// 如果处于翻转中,则不执行
|
||||||
|
if (isFlipping.value) return false;
|
||||||
|
frontTextFromData.value = front;
|
||||||
|
backTextFromData.value = back;
|
||||||
|
// 根据传递过来的type设置翻转方向
|
||||||
|
flipType.value = type;
|
||||||
|
// 设置翻转状态为true
|
||||||
|
isFlipping.value = true;
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
// 设置翻转状态为false
|
||||||
|
isFlipping.value = false;
|
||||||
|
frontTextFromData.value = back;
|
||||||
|
}, duration);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 下翻牌
|
||||||
|
const flipDown = (front: any, back: any): void => {
|
||||||
|
flip("down", front, back);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 上翻牌
|
||||||
|
const flipUp = (front: any, back: any): void => {
|
||||||
|
flip("up", front, back);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 设置前牌文字
|
||||||
|
function setFront(text: number): void {
|
||||||
|
frontTextFromData.value = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置后牌文字
|
||||||
|
const setBack = (text: number): void => {
|
||||||
|
backTextFromData.value = text;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
flipType,
|
||||||
|
isFlipping,
|
||||||
|
frontTextFromData,
|
||||||
|
backTextFromData,
|
||||||
|
textClass,
|
||||||
|
flipDown,
|
||||||
|
flipUp,
|
||||||
|
setFront,
|
||||||
|
setBack,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
class={`m-flipper ${this.flipType} ${this.isFlipping ? "go" : ""}`}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class={`digital front ${this.textClass(this.frontTextFromData)}`}
|
||||||
|
></div>
|
||||||
|
<div
|
||||||
|
class={`digital back ${this.textClass(this.backTextFromData)}`}
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
@ -1,98 +1,3 @@
|
|||||||
<template>
|
|
||||||
<div class="m-flipper" :class="[flipType, {'go': isFlipping}]">
|
|
||||||
<div class="digital front" :class="textClass(frontTextFromData)"></div>
|
|
||||||
<div class="digital back" :class="textClass(backTextFromData)"></div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang='ts'>
|
|
||||||
import { defineComponent, ref } from "vue";
|
|
||||||
export default defineComponent({
|
|
||||||
props: {
|
|
||||||
// front paper text
|
|
||||||
// 前牌文字
|
|
||||||
frontText: {
|
|
||||||
type: [Number, String],
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
// back paper text
|
|
||||||
// 后牌文字
|
|
||||||
backText: {
|
|
||||||
type: [Number, String],
|
|
||||||
default: 1
|
|
||||||
},
|
|
||||||
// flipping duration, please be consistent with the CSS animation-duration value.
|
|
||||||
// 翻牌动画时间,与CSS中设置的animation-duration保持一致
|
|
||||||
duration: {
|
|
||||||
type: Number,
|
|
||||||
default: 600
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setup(props) {
|
|
||||||
const { frontText, backText, duration } = props;
|
|
||||||
let isFlipping = ref(false);
|
|
||||||
let flipType = ref("down");
|
|
||||||
let frontTextFromData = ref(frontText);
|
|
||||||
let backTextFromData = ref(backText);
|
|
||||||
|
|
||||||
const textClass = (number: string) => {
|
|
||||||
return "number" + number;
|
|
||||||
};
|
|
||||||
|
|
||||||
const flip = (type: string, front: number, back: number) => {
|
|
||||||
// 如果处于翻转中,则不执行
|
|
||||||
if (isFlipping.value) return false;
|
|
||||||
frontTextFromData.value = front;
|
|
||||||
backTextFromData.value = back;
|
|
||||||
// 根据传递过来的type设置翻转方向
|
|
||||||
flipType.value = type;
|
|
||||||
// 设置翻转状态为true
|
|
||||||
isFlipping.value = true;
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
// 设置翻转状态为false
|
|
||||||
isFlipping.value = false;
|
|
||||||
frontTextFromData.value = back;
|
|
||||||
}, duration);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 下翻牌
|
|
||||||
const flipDown = (front: any, back: any): void => {
|
|
||||||
flip("down", front, back);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 上翻牌
|
|
||||||
const flipUp = (front: any, back: any): void => {
|
|
||||||
flip("up", front, back);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 设置前牌文字
|
|
||||||
const setFront = (text: number): void => {
|
|
||||||
frontTextFromData.value = text;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 设置后牌文字
|
|
||||||
const setBack = (text: number): void => {
|
|
||||||
backTextFromData.value = text;
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
isFlipping,
|
|
||||||
flipType,
|
|
||||||
frontTextFromData,
|
|
||||||
backTextFromData,
|
|
||||||
textClass,
|
|
||||||
flip,
|
|
||||||
flipDown,
|
|
||||||
flipUp,
|
|
||||||
setFront,
|
|
||||||
setBack
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.m-flipper {
|
.m-flipper {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
position: relative;
|
position: relative;
|
||||||
@ -277,4 +182,3 @@ export default defineComponent({
|
|||||||
.m-flipper .number9:after {
|
.m-flipper .number9:after {
|
||||||
content: "9";
|
content: "9";
|
||||||
}
|
}
|
||||||
</style>
|
|
@ -13,11 +13,11 @@
|
|||||||
|
|
||||||
<script lang='ts'>
|
<script lang='ts'>
|
||||||
import { ref, onBeforeMount, getCurrentInstance, nextTick } from "vue";
|
import { ref, onBeforeMount, getCurrentInstance, nextTick } from "vue";
|
||||||
import flippers from "./Flipper.vue";
|
import flippers from "./Filpper";
|
||||||
export default {
|
export default {
|
||||||
name: "Flop",
|
name: "Flop",
|
||||||
components: {
|
components: {
|
||||||
flippers,
|
flippers
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
let vm: any;
|
let vm: any;
|
||||||
@ -68,7 +68,7 @@ export default {
|
|||||||
"d+": date.getDate(),
|
"d+": date.getDate(),
|
||||||
"h+": date.getHours(),
|
"h+": date.getHours(),
|
||||||
"i+": date.getMinutes(),
|
"i+": date.getMinutes(),
|
||||||
"s+": date.getSeconds(),
|
"s+": date.getSeconds()
|
||||||
};
|
};
|
||||||
for (let k in o) {
|
for (let k in o) {
|
||||||
if (new RegExp(`(${k})`).test(dateFormat)) {
|
if (new RegExp(`(${k})`).test(dateFormat)) {
|
||||||
@ -102,7 +102,7 @@ export default {
|
|||||||
vm.refs.flipperMinute1,
|
vm.refs.flipperMinute1,
|
||||||
vm.refs.flipperMinute2,
|
vm.refs.flipperMinute2,
|
||||||
vm.refs.flipperSecond1,
|
vm.refs.flipperSecond1,
|
||||||
vm.refs.flipperSecond2,
|
vm.refs.flipperSecond2
|
||||||
];
|
];
|
||||||
|
|
||||||
init();
|
init();
|
||||||
@ -116,9 +116,9 @@ export default {
|
|||||||
init,
|
init,
|
||||||
run,
|
run,
|
||||||
formatDate,
|
formatDate,
|
||||||
padLeftZero,
|
padLeftZero
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
22
src/components/ReFlowChart/index.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import control from "./src/Control.vue";
|
||||||
|
import nodePanel from "./src/NodePanel.vue";
|
||||||
|
import dataDialog from "./src/DataDialog.vue";
|
||||||
|
|
||||||
|
export const Control = Object.assign(control, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(control.name, control);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const NodePanel = Object.assign(nodePanel, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(nodePanel.name, nodePanel);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const DataDialog = Object.assign(dataDialog, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(dataDialog.name, dataDialog);
|
||||||
|
},
|
||||||
|
});
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
10
src/components/ReHamBurger/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import reHamBurger from "./src/index.vue";
|
||||||
|
|
||||||
|
export const ReHamBurger = Object.assign(reHamBurger, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(reHamBurger.name, reHamBurger);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ReHamBurger;
|
10
src/components/ReSeamlessScroll/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import reSeamlessScroll from "./src/index.vue";
|
||||||
|
|
||||||
|
export const ReSeamlessScroll = Object.assign(reSeamlessScroll, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(reSeamlessScroll.name, reSeamlessScroll);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ReSeamlessScroll;
|
10
src/components/ReSelector/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue";
|
||||||
|
import reSelector from "./src";
|
||||||
|
|
||||||
|
export const ReSelector = Object.assign(reSelector, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(reSelector.name, reSelector);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ReSelector;
|
@ -1,39 +1,14 @@
|
|||||||
/**
|
|
||||||
<template>
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td
|
|
||||||
v-for="(item, key) in max"
|
|
||||||
:data-index="HsKey"
|
|
||||||
:ref="'hstd' + HsKey + key"
|
|
||||||
:class="['hs-select__item' + key]"
|
|
||||||
@mousemove.prevent="setCurrentValue(key, $event)"
|
|
||||||
@mouseleave.prevent="resetCurrentValue(key)"
|
|
||||||
@click="selectValue(key, item)"
|
|
||||||
:style="{ cursor: rateDisabled ? 'auto' : 'pointer', 'text-align': 'center' }"
|
|
||||||
:key="key"
|
|
||||||
>
|
|
||||||
<div :ref="'hsdiv' + HsKey + key" :class="[classes[key] + key]" class="hs-item">
|
|
||||||
<span>{{item}}</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang='ts'>
|
|
||||||
import {
|
import {
|
||||||
defineComponent,
|
defineComponent,
|
||||||
computed,
|
computed,
|
||||||
nextTick,
|
nextTick,
|
||||||
onBeforeMount,
|
onBeforeMount,
|
||||||
getCurrentInstance,
|
getCurrentInstance,
|
||||||
|
unref,
|
||||||
} from "vue";
|
} from "vue";
|
||||||
import { addClass, removeClass, toggleClass } from "/@/utils/operate";
|
import { addClass, removeClass, toggleClass } from "/@/utils/operate";
|
||||||
|
import "./index.css";
|
||||||
|
|
||||||
// 选中非选中状态
|
|
||||||
let stayClass = "stay"; //鼠标点击
|
let stayClass = "stay"; //鼠标点击
|
||||||
let activeClass = "hs-on"; //鼠标移动上去
|
let activeClass = "hs-on"; //鼠标移动上去
|
||||||
let voidClass = "hs-off"; //鼠标移开
|
let voidClass = "hs-off"; //鼠标移开
|
||||||
@ -42,11 +17,10 @@ let bothLeftSides = "both-left-sides";
|
|||||||
let bothRightSides = "both-right-sides";
|
let bothRightSides = "both-right-sides";
|
||||||
let selectedDirection = "right"; //默认从左往右,索引变大
|
let selectedDirection = "right"; //默认从左往右,索引变大
|
||||||
|
|
||||||
|
let overList = [];
|
||||||
// 存放第一个选中的元素和最后一个选中元素,只能存放这两个元素
|
// 存放第一个选中的元素和最后一个选中元素,只能存放这两个元素
|
||||||
let selectedList = [];
|
let selectedList = [];
|
||||||
|
|
||||||
let overList = [];
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "Selector",
|
name: "Selector",
|
||||||
props: {
|
props: {
|
||||||
@ -63,8 +37,8 @@ export default defineComponent({
|
|||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
max: {
|
max: {
|
||||||
type: Number,
|
type: Array,
|
||||||
default: 10,
|
default: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
||||||
},
|
},
|
||||||
// 回显数据的索引,长度必须是2
|
// 回显数据的索引,长度必须是2
|
||||||
echo: {
|
echo: {
|
||||||
@ -91,14 +65,14 @@ export default defineComponent({
|
|||||||
for (; i < threshold; i++) {
|
for (; i < threshold; i++) {
|
||||||
result.push(activeClass);
|
result.push(activeClass);
|
||||||
}
|
}
|
||||||
for (; i < props.max; i++) {
|
for (; i < props.max.length; i++) {
|
||||||
result.push(voidClass);
|
result.push(voidClass);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
|
|
||||||
// 鼠标移入
|
// 鼠标移入
|
||||||
const setCurrentValue = (index, event) => {
|
const setCurrentValue = (index) => {
|
||||||
if (props.disabled) return;
|
if (props.disabled) return;
|
||||||
// 当选中一个元素后,开始添加背景色
|
// 当选中一个元素后,开始添加背景色
|
||||||
if (selectedList.length === 1) {
|
if (selectedList.length === 1) {
|
||||||
@ -242,7 +216,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
selectedList = [];
|
selectedList = [];
|
||||||
overList = [];
|
overList = [];
|
||||||
for (let i = 0; i <= props.max; i++) {
|
for (let i = 0; i <= props.max.length; i++) {
|
||||||
let currentDom = document.querySelector(".hs-select__item" + i);
|
let currentDom = document.querySelector(".hs-select__item" + i);
|
||||||
if (currentDom) {
|
if (currentDom) {
|
||||||
removeClass(currentDom, inRange);
|
removeClass(currentDom, inRange);
|
||||||
@ -263,6 +237,7 @@ export default defineComponent({
|
|||||||
// 回显数据
|
// 回显数据
|
||||||
const echoView = (item) => {
|
const echoView = (item) => {
|
||||||
if (item.length === 0) return;
|
if (item.length === 0) return;
|
||||||
|
|
||||||
if (item.length > 2 || item.length === 1) {
|
if (item.length > 2 || item.length === 1) {
|
||||||
throw "传入的数组长度必须是2";
|
throw "传入的数组长度必须是2";
|
||||||
}
|
}
|
||||||
@ -300,41 +275,39 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return () => (
|
||||||
rateDisabled,
|
<>
|
||||||
setCurrentValue,
|
<table cellspacing="0" cellpadding="0">
|
||||||
resetCurrentValue,
|
<tbody>
|
||||||
selectValue,
|
<tr>
|
||||||
classes,
|
{props.max.map((item, key) => {
|
||||||
echoView,
|
return (
|
||||||
};
|
<td
|
||||||
|
data-index={props.HsKey}
|
||||||
|
ref={`hstd${props.HsKey}${key}`}
|
||||||
|
class={`hs-select__item${key}`}
|
||||||
|
onMousemove={() => setCurrentValue(key)}
|
||||||
|
onMouseleave={() => resetCurrentValue(key)}
|
||||||
|
onClick={() => selectValue(key, item)}
|
||||||
|
style={{
|
||||||
|
cursor: unref(rateDisabled) ? "auto" : "pointer",
|
||||||
|
textAlign: "center",
|
||||||
|
}}
|
||||||
|
key={key}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
ref={`hsdiv${props.HsKey}${key}`}
|
||||||
|
class={`hs-item ${[unref(classes)[key] + key]}`}
|
||||||
|
>
|
||||||
|
<span>{item}</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</>
|
||||||
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.hs-rate__icon {
|
|
||||||
font-size: 18px;
|
|
||||||
transition: 0.3s;
|
|
||||||
}
|
|
||||||
.hs-item {
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
line-height: 30px;
|
|
||||||
}
|
|
||||||
.hs-on {
|
|
||||||
background-color: #409eff;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
.hs-range {
|
|
||||||
background-color: #ccc;
|
|
||||||
}
|
|
||||||
.both-left-sides {
|
|
||||||
border-radius: 50% 0 0 50%;
|
|
||||||
}
|
|
||||||
.both-right-sides {
|
|
||||||
border-radius: 0 50% 50% 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
*/
|
|
44
src/components/ReSplitPane/index.css
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
.clearfix:after {
|
||||||
|
visibility: hidden;
|
||||||
|
display: block;
|
||||||
|
font-size: 0;
|
||||||
|
content: " ";
|
||||||
|
clear: both;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
.vue-splitter-container {
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.vue-splitter-container-mask {
|
||||||
|
z-index: 9999;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitter-pane.vertical.splitter-paneL {
|
||||||
|
position: absolute;
|
||||||
|
left: 0px;
|
||||||
|
height: 100%;
|
||||||
|
padding-right: 3px;
|
||||||
|
}
|
||||||
|
.splitter-pane.vertical.splitter-paneR {
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
height: 100%;
|
||||||
|
padding-left: 3px;
|
||||||
|
}
|
||||||
|
.splitter-pane.horizontal.splitter-paneL {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.splitter-pane.horizontal.splitter-paneR {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0px;
|
||||||
|
width: 100%;
|
||||||
|
padding-top: 3px;
|
||||||
|
}
|
@ -1,45 +1,6 @@
|
|||||||
<template>
|
import { defineComponent, ref, unref, computed, PropType } from "vue";
|
||||||
<div
|
import resizer from "./resizer";
|
||||||
:style="{ cursor, userSelect }"
|
import "./index.css";
|
||||||
class="vue-splitter-container clearfix"
|
|
||||||
@mouseup="onMouseUp"
|
|
||||||
@mousemove="onMouseMove"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
:class="leftClass"
|
|
||||||
:split="splitSet.split"
|
|
||||||
:style="{ [type]: percent + '%' }"
|
|
||||||
>
|
|
||||||
<slot name="paneL"></slot>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<resizer
|
|
||||||
:style="{ [resizeType]: percent + '%' }"
|
|
||||||
:split="splitSet.split"
|
|
||||||
@mousedown.prevent="onMouseDown"
|
|
||||||
@click.prevent="onClick"
|
|
||||||
></resizer>
|
|
||||||
|
|
||||||
<div
|
|
||||||
:class="rightClass"
|
|
||||||
:split="splitSet.split"
|
|
||||||
:style="{ [type]: 100 - percent + '%' }"
|
|
||||||
>
|
|
||||||
<slot name="paneR"></slot>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="active" class="vue-splitter-container-mask"></div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang='ts'>
|
|
||||||
import {
|
|
||||||
defineComponent,
|
|
||||||
ref,
|
|
||||||
computed,
|
|
||||||
PropType,
|
|
||||||
} from "vue";
|
|
||||||
import resizer from "./resizer.vue";
|
|
||||||
|
|
||||||
export interface ContextProps {
|
export interface ContextProps {
|
||||||
minPercent: number;
|
minPercent: number;
|
||||||
@ -60,7 +21,6 @@ export default defineComponent({
|
|||||||
setup(props, ctx) {
|
setup(props, ctx) {
|
||||||
let active = ref(false);
|
let active = ref(false);
|
||||||
let hasMoved = ref(false);
|
let hasMoved = ref(false);
|
||||||
let height = ref(null);
|
|
||||||
let percent = ref(props.splitSet?.defaultPercent);
|
let percent = ref(props.splitSet?.defaultPercent);
|
||||||
let type = props.splitSet?.split === "vertical" ? "width" : "height";
|
let type = props.splitSet?.split === "vertical" ? "width" : "height";
|
||||||
let resizeType = props.splitSet?.split === "vertical" ? "left" : "top";
|
let resizeType = props.splitSet?.split === "vertical" ? "left" : "top";
|
||||||
@ -145,69 +105,35 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return () => (
|
||||||
userSelect,
|
<>
|
||||||
cursor,
|
<div
|
||||||
active,
|
class="vue-splitter-container clearfix"
|
||||||
hasMoved,
|
style={(unref(cursor), unref(userSelect))}
|
||||||
height,
|
onMouseup={() => onMouseUp()}
|
||||||
percent,
|
onMousemove={() => onMouseMove(event)}
|
||||||
type,
|
>
|
||||||
resizeType,
|
<div
|
||||||
onClick,
|
class={unref(leftClass)}
|
||||||
onMouseDown,
|
style={{ [unref(type)]: unref(percent) + "%" }}
|
||||||
onMouseUp,
|
>
|
||||||
onMouseMove,
|
{ctx.slots.paneL()}
|
||||||
leftClass: leftClass.value.join(" "),
|
</div>
|
||||||
rightClass: rightClass.value.join(" "),
|
<resizer
|
||||||
};
|
style={`${unref([resizeType])}:${unref(percent)}%`}
|
||||||
|
split={props.splitSet?.split}
|
||||||
|
onMousedown={() => onMouseDown()}
|
||||||
|
onClick={() => onClick()}
|
||||||
|
></resizer>
|
||||||
|
<div
|
||||||
|
class={unref(rightClass)}
|
||||||
|
style={{ [unref(type)]: 100 - unref(percent) + "%" }}
|
||||||
|
>
|
||||||
|
{ctx.slots.paneR()}
|
||||||
|
</div>
|
||||||
|
<div v-show={unref(active)} class="vue-splitter-container-mask"></div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.clearfix:after {
|
|
||||||
visibility: hidden;
|
|
||||||
display: block;
|
|
||||||
font-size: 0;
|
|
||||||
content: " ";
|
|
||||||
clear: both;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
.vue-splitter-container {
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.vue-splitter-container-mask {
|
|
||||||
z-index: 9999;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.splitter-pane.vertical.splitter-paneL {
|
|
||||||
position: absolute;
|
|
||||||
left: 0px;
|
|
||||||
height: 100%;
|
|
||||||
padding-right: 3px;
|
|
||||||
}
|
|
||||||
.splitter-pane.vertical.splitter-paneR {
|
|
||||||
position: absolute;
|
|
||||||
right: 0px;
|
|
||||||
height: 100%;
|
|
||||||
padding-left: 3px;
|
|
||||||
}
|
|
||||||
.splitter-pane.horizontal.splitter-paneL {
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.splitter-pane.horizontal.splitter-paneR {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0px;
|
|
||||||
width: 100%;
|
|
||||||
padding-top: 3px;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,33 +1,3 @@
|
|||||||
<template>
|
|
||||||
<div :class="classes"></div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang='ts'>
|
|
||||||
import { computed, defineComponent } from "vue";
|
|
||||||
export default defineComponent({
|
|
||||||
name: "resizer",
|
|
||||||
props: {
|
|
||||||
split: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
className: {
|
|
||||||
type: String,
|
|
||||||
default: "",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
setup(props, ctx) {
|
|
||||||
let classes = computed(() => {
|
|
||||||
return ["splitter-pane-resizer", props.split, props.className].join(" ");
|
|
||||||
});
|
|
||||||
return {
|
|
||||||
classes,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.splitter-pane-resizer {
|
.splitter-pane-resizer {
|
||||||
-moz-box-sizing: border-box;
|
-moz-box-sizing: border-box;
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
@ -56,4 +26,3 @@ export default defineComponent({
|
|||||||
border-right: 5px solid rgba(255, 255, 255, 0);
|
border-right: 5px solid rgba(255, 255, 255, 0);
|
||||||
cursor: col-resize;
|
cursor: col-resize;
|
||||||
}
|
}
|
||||||
</style>
|
|
23
src/components/ReSplitPane/resizer.tsx
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { computed, unref, defineComponent } from "vue";
|
||||||
|
import "./resizer.css";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "resizer",
|
||||||
|
props: {
|
||||||
|
split: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
className: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
let classes = computed(() => {
|
||||||
|
return ["splitter-pane-resizer", props.split, props.className].join(" ");
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => <div class={unref(classes)}></div>;
|
||||||
|
},
|
||||||
|
});
|
@ -1,10 +0,0 @@
|
|||||||
import { App } from "vue"
|
|
||||||
import seamlessScroll from "./src/SeamlessScroll.vue"
|
|
||||||
|
|
||||||
export const SeamlessScroll = Object.assign(seamlessScroll, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(seamlessScroll.name, seamlessScroll)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default SeamlessScroll
|
|
@ -1,10 +0,0 @@
|
|||||||
import { App } from "vue";
|
|
||||||
import countTo from "./src/countTo";
|
|
||||||
|
|
||||||
export const CountTo = Object.assign(countTo, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(countTo.name, countTo);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
export default CountTo;
|
|
@ -1,180 +0,0 @@
|
|||||||
/**
|
|
||||||
<template>
|
|
||||||
<span :style="{color: color,fontSize: fontSize}">{{ displayValue }}</span>
|
|
||||||
</template>
|
|
||||||
<script lang="ts">
|
|
||||||
import {
|
|
||||||
defineComponent,
|
|
||||||
reactive,
|
|
||||||
computed,
|
|
||||||
watch,
|
|
||||||
onMounted,
|
|
||||||
unref,
|
|
||||||
toRef
|
|
||||||
} from "vue";
|
|
||||||
import { countToProps } from "./props";
|
|
||||||
import { isNumber } from "/@/utils/is";
|
|
||||||
export default defineComponent({
|
|
||||||
name: "CountTo",
|
|
||||||
props: countToProps,
|
|
||||||
emits: ["mounted", "callback"],
|
|
||||||
setup(props, { emit }) {
|
|
||||||
const state = reactive<{
|
|
||||||
localStartVal: number;
|
|
||||||
printVal: number | null;
|
|
||||||
displayValue: string;
|
|
||||||
paused: boolean;
|
|
||||||
localDuration: number | null;
|
|
||||||
startTime: number | null;
|
|
||||||
timestamp: number | null;
|
|
||||||
rAF: any;
|
|
||||||
remaining: number | null;
|
|
||||||
color: any;
|
|
||||||
fontSize: string;
|
|
||||||
}>({
|
|
||||||
localStartVal: props.startVal,
|
|
||||||
displayValue: formatNumber(props.startVal),
|
|
||||||
printVal: null,
|
|
||||||
paused: false,
|
|
||||||
localDuration: props.duration,
|
|
||||||
startTime: null,
|
|
||||||
timestamp: null,
|
|
||||||
remaining: null,
|
|
||||||
rAF: null,
|
|
||||||
color: null,
|
|
||||||
fontSize: "16px"
|
|
||||||
});
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
if (props.autoplay) {
|
|
||||||
start();
|
|
||||||
}
|
|
||||||
emit("mounted");
|
|
||||||
});
|
|
||||||
|
|
||||||
const getCountDown = computed(() => {
|
|
||||||
return props.startVal > props.endVal;
|
|
||||||
});
|
|
||||||
|
|
||||||
watch([() => props.startVal, () => props.endVal], () => {
|
|
||||||
if (props.autoplay) {
|
|
||||||
start();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function start() {
|
|
||||||
const { startVal, duration, color, fontSize } = props;
|
|
||||||
state.localStartVal = startVal;
|
|
||||||
state.startTime = null;
|
|
||||||
state.localDuration = duration;
|
|
||||||
state.paused = false;
|
|
||||||
state.color = color;
|
|
||||||
state.fontSize = fontSize;
|
|
||||||
state.rAF = requestAnimationFrame(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
function pauseResume() {
|
|
||||||
if (state.paused) {
|
|
||||||
resume();
|
|
||||||
state.paused = false;
|
|
||||||
} else {
|
|
||||||
pause();
|
|
||||||
state.paused = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function pause() {
|
|
||||||
cancelAnimationFrame(state.rAF);
|
|
||||||
}
|
|
||||||
|
|
||||||
function resume() {
|
|
||||||
state.startTime = null;
|
|
||||||
state.localDuration = +(state.remaining as number);
|
|
||||||
state.localStartVal = +(state.printVal as number);
|
|
||||||
requestAnimationFrame(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
function reset() {
|
|
||||||
state.startTime = null;
|
|
||||||
cancelAnimationFrame(state.rAF);
|
|
||||||
state.displayValue = formatNumber(props.startVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
function count(timestamp: number) {
|
|
||||||
const { useEasing, easingFn, endVal } = props;
|
|
||||||
if (!state.startTime) state.startTime = timestamp;
|
|
||||||
state.timestamp = timestamp;
|
|
||||||
const progress = timestamp - state.startTime;
|
|
||||||
state.remaining = (state.localDuration as number) - progress;
|
|
||||||
if (useEasing) {
|
|
||||||
if (unref(getCountDown)) {
|
|
||||||
state.printVal =
|
|
||||||
state.localStartVal -
|
|
||||||
easingFn(
|
|
||||||
progress,
|
|
||||||
0,
|
|
||||||
state.localStartVal - endVal,
|
|
||||||
state.localDuration as number
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
state.printVal = easingFn(
|
|
||||||
progress,
|
|
||||||
state.localStartVal,
|
|
||||||
endVal - state.localStartVal,
|
|
||||||
state.localDuration as number
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (unref(getCountDown)) {
|
|
||||||
state.printVal =
|
|
||||||
state.localStartVal -
|
|
||||||
(state.localStartVal - endVal) *
|
|
||||||
(progress / (state.localDuration as number));
|
|
||||||
} else {
|
|
||||||
state.printVal =
|
|
||||||
state.localStartVal +
|
|
||||||
(endVal - state.localStartVal) *
|
|
||||||
(progress / (state.localDuration as number));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (unref(getCountDown)) {
|
|
||||||
state.printVal = state.printVal < endVal ? endVal : state.printVal;
|
|
||||||
} else {
|
|
||||||
state.printVal = state.printVal > endVal ? endVal : state.printVal;
|
|
||||||
}
|
|
||||||
state.displayValue = formatNumber(state.printVal);
|
|
||||||
if (progress < (state.localDuration as number)) {
|
|
||||||
state.rAF = requestAnimationFrame(count);
|
|
||||||
} else {
|
|
||||||
emit("callback");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatNumber(num: number | string) {
|
|
||||||
const { decimals, decimal, separator, suffix, prefix } = props;
|
|
||||||
num = Number(num).toFixed(decimals);
|
|
||||||
num += "";
|
|
||||||
const x = num.split(".");
|
|
||||||
let x1 = x[0];
|
|
||||||
const x2 = x.length > 1 ? decimal + x[1] : "";
|
|
||||||
const rgx = /(\d+)(\d{3})/;
|
|
||||||
if (separator && !isNumber(separator)) {
|
|
||||||
while (rgx.test(x1)) {
|
|
||||||
x1 = x1.replace(rgx, "$1" + separator + "$2");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return prefix + x1 + x2 + suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
count,
|
|
||||||
reset,
|
|
||||||
resume,
|
|
||||||
start,
|
|
||||||
pauseResume,
|
|
||||||
displayValue: toRef(state, "displayValue")
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
*/
|
|
@ -1,10 +0,0 @@
|
|||||||
import { App } from "vue"
|
|
||||||
import selector from "./src/selector"
|
|
||||||
|
|
||||||
export const Selector = Object.assign(selector, {
|
|
||||||
install(app: App) {
|
|
||||||
app.component(selector.name, selector)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default Selector
|
|
@ -1,309 +0,0 @@
|
|||||||
import {
|
|
||||||
defineComponent,
|
|
||||||
computed,
|
|
||||||
nextTick,
|
|
||||||
onBeforeMount,
|
|
||||||
getCurrentInstance,
|
|
||||||
unref
|
|
||||||
} from "vue"
|
|
||||||
import { addClass, removeClass, toggleClass } from "/@/utils/operate"
|
|
||||||
import "./index.css"
|
|
||||||
|
|
||||||
let stayClass = "stay" //鼠标点击
|
|
||||||
let activeClass = "hs-on" //鼠标移动上去
|
|
||||||
let voidClass = "hs-off" //鼠标移开
|
|
||||||
let inRange = "hs-range" //当前选中的两个元素之间的背景
|
|
||||||
let bothLeftSides = "both-left-sides"
|
|
||||||
let bothRightSides = "both-right-sides"
|
|
||||||
let selectedDirection = "right" //默认从左往右,索引变大
|
|
||||||
|
|
||||||
let overList = []
|
|
||||||
// 存放第一个选中的元素和最后一个选中元素,只能存放这两个元素
|
|
||||||
let selectedList = []
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
name: "Selector",
|
|
||||||
props: {
|
|
||||||
HsKey: {
|
|
||||||
type: Number || String,
|
|
||||||
default: 0,
|
|
||||||
},
|
|
||||||
disabled: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
value: {
|
|
||||||
type: Number,
|
|
||||||
default: 0,
|
|
||||||
},
|
|
||||||
max: {
|
|
||||||
type: Array,
|
|
||||||
default: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
|
||||||
},
|
|
||||||
// 回显数据的索引,长度必须是2
|
|
||||||
echo: {
|
|
||||||
type: Array,
|
|
||||||
default: [],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
emits: ["selectedVal"],
|
|
||||||
setup(props, { emit }) {
|
|
||||||
let vm: any
|
|
||||||
let currentValue = props.value
|
|
||||||
|
|
||||||
let rateDisabled = computed(() => {
|
|
||||||
return props.disabled
|
|
||||||
})
|
|
||||||
|
|
||||||
let classes = computed(() => {
|
|
||||||
let result = []
|
|
||||||
let i = 0
|
|
||||||
let threshold = currentValue
|
|
||||||
if (currentValue !== Math.floor(currentValue)) {
|
|
||||||
threshold--
|
|
||||||
}
|
|
||||||
for (; i < threshold; i++) {
|
|
||||||
result.push(activeClass)
|
|
||||||
}
|
|
||||||
for (; i < props.max.length; i++) {
|
|
||||||
result.push(voidClass)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
})
|
|
||||||
|
|
||||||
// 鼠标移入
|
|
||||||
const setCurrentValue = (index) => {
|
|
||||||
if (props.disabled) return
|
|
||||||
// 当选中一个元素后,开始添加背景色
|
|
||||||
if (selectedList.length === 1) {
|
|
||||||
if (overList.length < 1) overList.push({ index })
|
|
||||||
|
|
||||||
let firstIndex = overList[0].index
|
|
||||||
|
|
||||||
// 往右走,索引变大
|
|
||||||
if (index > firstIndex) {
|
|
||||||
selectedDirection = "right"
|
|
||||||
toggleClass(
|
|
||||||
false,
|
|
||||||
bothRightSides,
|
|
||||||
document.querySelector(".hs-select__item" + selectedList[0].index)
|
|
||||||
)
|
|
||||||
|
|
||||||
while (index >= firstIndex) {
|
|
||||||
addClass(
|
|
||||||
document.querySelector(".hs-select__item" + firstIndex),
|
|
||||||
inRange
|
|
||||||
)
|
|
||||||
firstIndex++
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
selectedDirection = "left"
|
|
||||||
toggleClass(
|
|
||||||
true,
|
|
||||||
bothRightSides,
|
|
||||||
document.querySelector(".hs-select__item" + selectedList[0].index)
|
|
||||||
)
|
|
||||||
|
|
||||||
while (index <= firstIndex) {
|
|
||||||
addClass(
|
|
||||||
document.querySelector(".hs-select__item" + firstIndex),
|
|
||||||
inRange
|
|
||||||
)
|
|
||||||
firstIndex--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addClass(document.querySelector("." + voidClass + index), activeClass)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 鼠标离开
|
|
||||||
const resetCurrentValue = (index) => {
|
|
||||||
if (props.disabled) return
|
|
||||||
// 移除先检查是否选中 选中则返回false 不移除
|
|
||||||
const currentHsDom = document.querySelector("." + voidClass + index)
|
|
||||||
if (currentHsDom.className.includes(stayClass)) {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
removeClass(currentHsDom, activeClass)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 当选中一个元素后,开始移除背景色
|
|
||||||
if (selectedList.length === 1) {
|
|
||||||
let firstIndex = overList[0].index
|
|
||||||
if (index >= firstIndex) {
|
|
||||||
for (let i = 0; i <= index; i++) {
|
|
||||||
removeClass(
|
|
||||||
document.querySelector(".hs-select__item" + i),
|
|
||||||
inRange
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (index <= firstIndex) {
|
|
||||||
removeClass(
|
|
||||||
document.querySelector(".hs-select__item" + index),
|
|
||||||
inRange
|
|
||||||
)
|
|
||||||
index++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 鼠标点击
|
|
||||||
const selectValue = (index, item) => {
|
|
||||||
if (props.disabled) return
|
|
||||||
let len = selectedList.length
|
|
||||||
|
|
||||||
if (len < 2) {
|
|
||||||
selectedList.push({ item, index })
|
|
||||||
addClass(document.querySelector("." + voidClass + index), stayClass)
|
|
||||||
|
|
||||||
addClass(
|
|
||||||
document.querySelector(".hs-select__item" + selectedList[0].index),
|
|
||||||
bothLeftSides
|
|
||||||
)
|
|
||||||
|
|
||||||
if (selectedList[1]) {
|
|
||||||
if (selectedDirection === "right") {
|
|
||||||
addClass(
|
|
||||||
document.querySelector(
|
|
||||||
".hs-select__item" + selectedList[1].index
|
|
||||||
),
|
|
||||||
bothRightSides
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
addClass(
|
|
||||||
document.querySelector(
|
|
||||||
".hs-select__item" + selectedList[1].index
|
|
||||||
),
|
|
||||||
bothLeftSides
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len === 1) {
|
|
||||||
// 顺时针排序
|
|
||||||
if (selectedDirection === "right") {
|
|
||||||
emit("selectedVal", {
|
|
||||||
left: selectedList[0].item,
|
|
||||||
right: selectedList[1].item,
|
|
||||||
whole: selectedList,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
emit("selectedVal", {
|
|
||||||
left: selectedList[1].item,
|
|
||||||
right: selectedList[0].item,
|
|
||||||
whole: selectedList,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
nextTick(() => {
|
|
||||||
selectedList.forEach((v) => {
|
|
||||||
removeClass(
|
|
||||||
document.querySelector("." + voidClass + v.index),
|
|
||||||
activeClass,
|
|
||||||
stayClass
|
|
||||||
)
|
|
||||||
|
|
||||||
removeClass(
|
|
||||||
document.querySelector(".hs-select__item" + v.index),
|
|
||||||
bothLeftSides,
|
|
||||||
bothRightSides
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
selectedList = []
|
|
||||||
overList = []
|
|
||||||
for (let i = 0; i <= props.max.length; i++) {
|
|
||||||
let currentDom = document.querySelector(".hs-select__item" + i)
|
|
||||||
if (currentDom) {
|
|
||||||
removeClass(currentDom, inRange)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
selectedList.push({ item, index })
|
|
||||||
addClass(document.querySelector("." + voidClass + index), stayClass)
|
|
||||||
|
|
||||||
addClass(
|
|
||||||
document.querySelector(".hs-select__item" + selectedList[0].index),
|
|
||||||
bothLeftSides
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 回显数据
|
|
||||||
const echoView = (item) => {
|
|
||||||
if (item.length === 0) return
|
|
||||||
|
|
||||||
if (item.length > 2 || item.length === 1) {
|
|
||||||
throw "传入的数组长度必须是2"
|
|
||||||
}
|
|
||||||
|
|
||||||
item.sort((a, b) => {
|
|
||||||
return a - b
|
|
||||||
})
|
|
||||||
|
|
||||||
addClass(
|
|
||||||
vm.refs["hsdiv" + props.HsKey + item[0]],
|
|
||||||
activeClass,
|
|
||||||
stayClass
|
|
||||||
)
|
|
||||||
|
|
||||||
addClass(vm.refs["hstd" + props.HsKey + item[0]], bothLeftSides)
|
|
||||||
|
|
||||||
addClass(
|
|
||||||
vm.refs["hsdiv" + props.HsKey + item[1]],
|
|
||||||
activeClass,
|
|
||||||
stayClass
|
|
||||||
)
|
|
||||||
|
|
||||||
addClass(vm.refs["hstd" + props.HsKey + item[1]], bothRightSides)
|
|
||||||
|
|
||||||
while (item[1] >= item[0]) {
|
|
||||||
addClass(vm.refs["hstd" + props.HsKey + item[0]], inRange)
|
|
||||||
item[0]++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onBeforeMount(() => {
|
|
||||||
vm = getCurrentInstance()
|
|
||||||
nextTick(() => {
|
|
||||||
echoView(props.echo)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
return () => (
|
|
||||||
<>
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
{
|
|
||||||
props.max.map((item, key) => {
|
|
||||||
return <td
|
|
||||||
data-index={props.HsKey}
|
|
||||||
ref={`hstd${props.HsKey}${key}`}
|
|
||||||
class={`hs-select__item${key}`}
|
|
||||||
onMousemove={() => setCurrentValue(key)}
|
|
||||||
onMouseleave={() => resetCurrentValue(key)}
|
|
||||||
onClick={() => selectValue(key, item)}
|
|
||||||
style={{
|
|
||||||
cursor: unref(rateDisabled) ? 'auto' : 'pointer', textAlign: 'center'
|
|
||||||
}}
|
|
||||||
key={key}
|
|
||||||
>
|
|
||||||
<div ref={`hsdiv${props.HsKey}${key}`} class={`hs-item ${[unref(classes)[key] + key]}`}>
|
|
||||||
<span>{item}</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
})
|
|
@ -42,8 +42,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { ref, defineComponent, onMounted, unref, watch } from "vue";
|
import { ref, defineComponent, onMounted, unref, watch } from "vue";
|
||||||
import Breadcrumb from "/@/components/BreadCrumb";
|
import Breadcrumb from "/@/components/ReBreadCrumb";
|
||||||
import Hamburger from "/@/components/HamBurger";
|
import Hamburger from "/@/components/ReHamBurger";
|
||||||
import screenfull from "../components/screenfull/index.vue";
|
import screenfull from "../components/screenfull/index.vue";
|
||||||
import { useRouter, useRoute } from "vue-router";
|
import { useRouter, useRoute } from "vue-router";
|
||||||
import { useAppStoreHook } from "/@/store/modules/app";
|
import { useAppStoreHook } from "/@/store/modules/app";
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang='ts'>
|
<script lang='ts'>
|
||||||
import CountTo from "/@/components/countTo";
|
import CountTo from "/@/components/ReCountTo";
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
CountTo
|
CountTo
|
||||||
|
@ -8,29 +8,28 @@
|
|||||||
<p v-if="cropperImg">裁剪后图片信息:{{ info }}</p>
|
<p v-if="cropperImg">裁剪后图片信息:{{ info }}</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent, ref, onBeforeMount, nextTick } from "vue";
|
|
||||||
import Cropper from "/@/components/Cropper";
|
|
||||||
import img from "./picture.jpeg";
|
|
||||||
import { emitter } from "/@/utils/mitt";
|
|
||||||
|
|
||||||
let cropperInstance = null;
|
<script lang="ts">
|
||||||
export default defineComponent({
|
import { ref, onBeforeMount, nextTick, getCurrentInstance } from "vue";
|
||||||
|
import Cropper from "/@/components/ReCropper";
|
||||||
|
import img from "./picture.jpeg";
|
||||||
|
|
||||||
|
export default {
|
||||||
components: {
|
components: {
|
||||||
Cropper,
|
Cropper
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
|
let vm: any;
|
||||||
let info = ref("");
|
let info = ref("");
|
||||||
let cropperImg = ref("");
|
let cropperImg = ref("");
|
||||||
|
|
||||||
const onCropper = (): void => {
|
const onCropper = (): void => {
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
let imgInfo = cropperInstance.getData();
|
vm.refs.refCropper.cropper.getCroppedCanvas().toBlob(blob => {
|
||||||
cropperInstance.getCroppedCanvas().toBlob((blob) => {
|
|
||||||
let fileReader: FileReader = new FileReader();
|
let fileReader: FileReader = new FileReader();
|
||||||
fileReader.onloadend = (e: any) => {
|
fileReader.onloadend = (e: any) => {
|
||||||
cropperImg.value = e.target.result;
|
cropperImg.value = e.target.result;
|
||||||
info.value = imgInfo;
|
info.value = vm.refs.refCropper.cropper.getData();
|
||||||
};
|
};
|
||||||
fileReader.readAsDataURL(blob);
|
fileReader.readAsDataURL(blob);
|
||||||
}, "image/jpeg");
|
}, "image/jpeg");
|
||||||
@ -38,19 +37,17 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
emitter.on("cropperInstance", (key) => {
|
vm = getCurrentInstance();
|
||||||
cropperInstance = key;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
img,
|
img,
|
||||||
info,
|
info,
|
||||||
cropperImg,
|
cropperImg,
|
||||||
onCropper,
|
onCropper
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
});
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
@ -5,17 +5,15 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang='ts'>
|
<script lang='ts'>
|
||||||
import { Amap } from "/@/components/Map";
|
import { Amap } from "/@/components/ReMap";
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
Amap
|
Amap
|
||||||
},
|
},
|
||||||
setup(){
|
setup() {
|
||||||
return{
|
return {};
|
||||||
|
}
|
||||||
}
|
};
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
import { ref, unref } from "vue";
|
import { ref, unref } from "vue";
|
||||||
import { templateRef } from "@vueuse/core";
|
import { templateRef } from "@vueuse/core";
|
||||||
|
|
||||||
import SeamlessScroll from "/@/components/SeamlessScroll";
|
import SeamlessScroll from "/@/components/ReSeamlessScroll";
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
SeamlessScroll
|
SeamlessScroll
|
||||||
|
@ -6,7 +6,12 @@
|
|||||||
<span>{{item.title}}</span>
|
<span>{{item.title}}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<Selector :HsKey="key" :echo="item.echo" @selectedVal="selectedVal" :disabled="item.disabled" />
|
<Selector
|
||||||
|
:HsKey="key"
|
||||||
|
:echo="item.echo"
|
||||||
|
@selectedVal="selectedVal"
|
||||||
|
:disabled="item.disabled"
|
||||||
|
/>
|
||||||
<h4 v-if="!item.disabled">选中范围:{{ selectRange }}</h4>
|
<h4 v-if="!item.disabled">选中范围:{{ selectRange }}</h4>
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
@ -14,7 +19,7 @@
|
|||||||
|
|
||||||
<script lang='ts'>
|
<script lang='ts'>
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import Selector from "/@/components/selector";
|
import Selector from "/@/components/ReSelector";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { Selector },
|
components: { Selector },
|
||||||
@ -24,13 +29,13 @@ export default {
|
|||||||
{
|
{
|
||||||
title: "基本使用",
|
title: "基本使用",
|
||||||
echo: [],
|
echo: [],
|
||||||
disabled: false,
|
disabled: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "回显模式",
|
title: "回显模式",
|
||||||
echo: [2, 7],
|
echo: [2, 7],
|
||||||
disabled: true,
|
disabled: true
|
||||||
},
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const selectedVal = ({ left, right, whole }) => {
|
const selectedVal = ({ left, right, whole }) => {
|
||||||
@ -40,8 +45,8 @@ export default {
|
|||||||
return {
|
return {
|
||||||
selectedVal,
|
selectedVal,
|
||||||
selectRange,
|
selectRange,
|
||||||
dataLists,
|
dataLists
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
@ -23,9 +23,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import splitpane, {
|
import splitpane, { ContextProps } from "/@/components/ReSplitPane";
|
||||||
ContextProps
|
|
||||||
} from "../../../components/splitPane/index.vue";
|
|
||||||
import { reactive } from "vue";
|
import { reactive } from "vue";
|
||||||
export default {
|
export default {
|
||||||
name: "split",
|
name: "split",
|
||||||
|
@ -19,13 +19,13 @@ import LogicFlow from "@logicflow/core";
|
|||||||
import { Snapshot, BpmnElement, Menu } from "@logicflow/extension";
|
import { Snapshot, BpmnElement, Menu } from "@logicflow/extension";
|
||||||
import "@logicflow/core/dist/style/index.css";
|
import "@logicflow/core/dist/style/index.css";
|
||||||
import "@logicflow/extension/lib/style/index.css";
|
import "@logicflow/extension/lib/style/index.css";
|
||||||
import { Control, NodePanel, DataDialog } from "/@/components/FlowChart";
|
import { Control, NodePanel, DataDialog } from "/@/components/ReFlowChart";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
toTurboData,
|
toTurboData,
|
||||||
toLogicflowData
|
toLogicflowData
|
||||||
} from "/@/components/FlowChart/src/adpterForTurbo";
|
} from "/@/components/ReFlowChart/src/adpterForTurbo";
|
||||||
import { BpmnNode } from "/@/components/FlowChart/src/config";
|
import { BpmnNode } from "/@/components/ReFlowChart/src/config";
|
||||||
import demoData from "./dataTurbo.json";
|
import demoData from "./dataTurbo.json";
|
||||||
export default {
|
export default {
|
||||||
components: { NodePanel, Control, DataDialog },
|
components: { NodePanel, Control, DataDialog },
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { reactive, onBeforeMount } from "vue";
|
import { reactive, onBeforeMount } from "vue";
|
||||||
import info, { ContextProps } from "../components/info/index.vue";
|
import info, { ContextProps } from "../components/ReInfo/index.vue";
|
||||||
import { getVerify, getLogin } from "/@/api/user";
|
import { getVerify, getLogin } from "/@/api/user";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { storageSession } from "/@/utils/storage";
|
import { storageSession } from "/@/utils/storage";
|
||||||
|
@ -12,7 +12,7 @@ import {
|
|||||||
onBeforeMount,
|
onBeforeMount,
|
||||||
getCurrentInstance
|
getCurrentInstance
|
||||||
} from "vue";
|
} from "vue";
|
||||||
import info, { ContextProps } from "../components/info/index.vue";
|
import info, { ContextProps } from "../components/ReInfo/index.vue";
|
||||||
import { getRegist, getVerify } from "/@/api/user";
|
import { getRegist, getVerify } from "/@/api/user";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { warnMessage, successMessage } from "/@/utils/message";
|
import { warnMessage, successMessage } from "/@/utils/message";
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang='ts'>
|
<script lang='ts'>
|
||||||
import Flop from "/@/components/Flop";
|
import Flop from "/@/components/ReFlop";
|
||||||
import { ref, computed, onMounted, nextTick } from "vue";
|
import { ref, computed, onMounted, nextTick } from "vue";
|
||||||
import { deviceDetection } from "/@/utils/deviceDetection";
|
import { deviceDetection } from "/@/utils/deviceDetection";
|
||||||
import { useEventListener, tryOnUnmounted, useTimeoutFn } from "@vueuse/core";
|
import { useEventListener, tryOnUnmounted, useTimeoutFn } from "@vueuse/core";
|
||||||
|
2
types/global.d.ts
vendored
@ -19,6 +19,8 @@ declare global {
|
|||||||
declare interface Window {
|
declare interface Window {
|
||||||
// Global vue app instance
|
// Global vue app instance
|
||||||
__APP__: App<Element>;
|
__APP__: App<Element>;
|
||||||
|
webkitCancelAnimationFrame: (id?: any) => any;
|
||||||
|
webkitRequestAnimationFrame: (id?: any) => any;
|
||||||
mozCancelAnimationFrame: (id?: any) => any;
|
mozCancelAnimationFrame: (id?: any) => any;
|
||||||
oCancelAnimationFrame: (id?: any) => any;
|
oCancelAnimationFrame: (id?: any) => any;
|
||||||
msCancelAnimationFrame: (id?: any) => any;
|
msCancelAnimationFrame: (id?: any) => any;
|
||||||
|