|
@@ -0,0 +1,206 @@
|
|
|
|
+<template>
|
|
|
|
+ <t-space direction="vertical" size="small" class="w-full">
|
|
|
|
+ <div v-for="item in props.pen.props.custom" class="form-item">
|
|
|
|
+ <label :title="item.label">{{ item.label }}</label>
|
|
|
|
+ <t-checkbox
|
|
|
|
+ class="ml-8"
|
|
|
|
+ v-if="item.type === 'bool'"
|
|
|
|
+ v-model="props.pen[item.key]"
|
|
|
|
+ @change="changeValue(item.key)"
|
|
|
|
+ />
|
|
|
|
+ <t-input-number
|
|
|
|
+ class="w-full"
|
|
|
|
+ v-else-if="item.type === 'number'"
|
|
|
|
+ v-model.number="props.pen[item.key]"
|
|
|
|
+ theme="column"
|
|
|
|
+ :max="item.max"
|
|
|
|
+ :min="item.min"
|
|
|
|
+ @change="changeValue(item.key)"
|
|
|
|
+ :placeholder="item.placeholder"
|
|
|
|
+ :allowInputOverLimit="false"
|
|
|
|
+ :decimalPlaces="2"
|
|
|
|
+ />
|
|
|
|
+ <t-color-picker
|
|
|
|
+ class="w-full"
|
|
|
|
+ v-else-if="item.type === 'color'"
|
|
|
|
+ :enable-alpha="true"
|
|
|
|
+ :recent-colors="null"
|
|
|
|
+ format="CSS"
|
|
|
|
+ :swatch-colors="defaultPureColor"
|
|
|
|
+ :color-modes="['monochrome']"
|
|
|
|
+ :show-primary-color-preview="false"
|
|
|
|
+ v-model="props.pen[item.key]"
|
|
|
|
+ @change="changeValue(item.key)"
|
|
|
|
+ :placeholder="item.placeholder"
|
|
|
|
+ />
|
|
|
|
+ <t-select
|
|
|
|
+ class="w-full"
|
|
|
|
+ v-else-if="item.type === 'select'"
|
|
|
|
+ size="small"
|
|
|
|
+ :options="item.options"
|
|
|
|
+ v-model="props.pen[item.key]"
|
|
|
|
+ @change="changeValue(item.key)"
|
|
|
|
+ :placeholder="item.placeholder"
|
|
|
|
+ />
|
|
|
|
+ <!-- <t-button
|
|
|
|
+ class="ml-8"
|
|
|
|
+ v-else-if="item.type === 'code'"
|
|
|
|
+ shape="square"
|
|
|
|
+ variant="outline"
|
|
|
|
+ style="width: 24px"
|
|
|
|
+ @click="showPropsEdit(item)"
|
|
|
|
+ >
|
|
|
|
+ <ellipsis-icon slot="icon"/>
|
|
|
|
+ </t-button> -->
|
|
|
|
+ <t-button
|
|
|
|
+ class="ml-8"
|
|
|
|
+ v-else-if="item.type === 'code'"
|
|
|
|
+ shape="square"
|
|
|
|
+ variant="outline"
|
|
|
|
+ style="width: 24px"
|
|
|
|
+ @click="showDrawer(item)"
|
|
|
|
+ >
|
|
|
|
+ <ChevronLeftDoubleIcon slot="icon" />
|
|
|
|
+ </t-button>
|
|
|
|
+ <t-slider
|
|
|
|
+ v-else-if="item.type === 'slider'"
|
|
|
|
+ v-model="props.pen[item.key]"
|
|
|
|
+ :min="0"
|
|
|
|
+ :max="1"
|
|
|
|
+ :step="0.01"
|
|
|
|
+ @change="changeValue(item.key)"
|
|
|
|
+ />
|
|
|
|
+ <t-switch
|
|
|
|
+ size="small"
|
|
|
|
+ class="mt-8 ml-8"
|
|
|
|
+ v-else-if="item.type === 'switch'"
|
|
|
|
+ v-model="props.pen[item.key]"
|
|
|
|
+ @change="changeValue(item.key)"
|
|
|
|
+ />
|
|
|
|
+ <t-input
|
|
|
|
+ class="w-full"
|
|
|
|
+ v-else
|
|
|
|
+ v-model="props.pen[item.key]"
|
|
|
|
+ @change="changeValue(item.key)"
|
|
|
|
+ :placeholder="item.placeholder"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ </t-space>
|
|
|
|
+ <t-drawer
|
|
|
|
+ v-model:visible="drawer.visible"
|
|
|
|
+ :header="drawer.header"
|
|
|
|
+ cancelBtn="关闭"
|
|
|
|
+ confirmBtn="运行"
|
|
|
|
+ @confirm="onConfirmDrawer"
|
|
|
|
+ :closeOnOverlayClick="false"
|
|
|
|
+ :sizeDraggable="true"
|
|
|
|
+ >
|
|
|
|
+ <div style="height: 100%">
|
|
|
|
+ <CodeEditor
|
|
|
|
+ style="height: 100%"
|
|
|
|
+ :key="drawer.randomkey"
|
|
|
|
+ :json="true"
|
|
|
|
+ :language="'json'"
|
|
|
|
+ v-model="drawer.value"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ <div class="gray" style="font-size: 12px">
|
|
|
|
+ {{ drawer.placeholder }}
|
|
|
|
+ </div>
|
|
|
|
+ </t-drawer>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script lang="ts" setup>
|
|
|
|
+import { reactive, defineComponent, ref } from 'vue';
|
|
|
|
+import {
|
|
|
|
+ getter,
|
|
|
|
+ setter,
|
|
|
|
+ queryURLParams,
|
|
|
|
+ deepClone,
|
|
|
|
+ getAllChildren,
|
|
|
|
+ Pen,
|
|
|
|
+} from '@meta2d/core';
|
|
|
|
+import { getLe5le3d, getLe5leV, getLe5le2d } from '@/services/api';
|
|
|
|
+import { updatePen } from './pen';
|
|
|
|
+import { defaultGradientColor, defaultPureColor } from '@/services/defaults';
|
|
|
|
+import { MessagePlugin } from 'tdesign-vue-next';
|
|
|
|
+import { s8 } from '@/services/random';
|
|
|
|
+import CodeEditor from '@/views/components/common/CodeEditor.vue';
|
|
|
|
+import { ChevronLeftDoubleIcon, } from 'tdesign-icons-vue-next';
|
|
|
|
+
|
|
|
|
+const props = defineProps<{
|
|
|
|
+ pen: any;
|
|
|
|
+}>();
|
|
|
|
+
|
|
|
|
+const changeValue = (prop: string) => {
|
|
|
|
+ updatePen(props.pen, prop);
|
|
|
|
+ // selections.pen[prop] = getter(props.pen, prop);
|
|
|
|
+ if (prop === 'iframe') {
|
|
|
|
+ getThumbImg();
|
|
|
|
+ }
|
|
|
|
+ if (prop === 'apiEnable') {
|
|
|
|
+ meta2d.penNetwork(props.pen);
|
|
|
|
+ meta2d.connectNetwork();
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const getThumbImg = async () => {
|
|
|
|
+ //改iframe地址后
|
|
|
|
+ let arr = props.pen.iframe.split('?');
|
|
|
|
+ let id = queryURLParams(arr[1]).id;
|
|
|
|
+ if (!id) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // let projection = {
|
|
|
|
+ // image: 1,
|
|
|
|
+ // _id: 1,
|
|
|
|
+ // name: 1,
|
|
|
|
+ // };
|
|
|
|
+ let projection = 'image,id,name';
|
|
|
|
+ let res: any;
|
|
|
|
+ if (
|
|
|
|
+ arr[0].indexOf('2d.le5le') !== -1 ||
|
|
|
|
+ arr[0].indexOf('le5le.com/2d') !== -1
|
|
|
|
+ ) {
|
|
|
|
+ res = await getLe5le2d(id, projection);
|
|
|
|
+ } else if (
|
|
|
|
+ arr[0].indexOf('v.le5le') !== -1 ||
|
|
|
|
+ arr[0].indexOf('le5le.com/v') !== -1
|
|
|
|
+ ) {
|
|
|
|
+ res = await getLe5leV(id, projection);
|
|
|
|
+ } else if (
|
|
|
|
+ arr[0].indexOf('3d.le5le') !== -1 ||
|
|
|
|
+ arr[0].indexOf('le5le.com/3d') !== -1
|
|
|
|
+ ) {
|
|
|
|
+ res = await getLe5le3d(id, projection);
|
|
|
|
+ }
|
|
|
|
+ if (res) {
|
|
|
|
+ props.pen.thumbImg = res.image;
|
|
|
|
+ props.pen.calculative && (props.pen.calculative.img = null);
|
|
|
|
+ }
|
|
|
|
+ props.pen.onRenderPenRaw?.(props.pen);
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const drawer = reactive<any>({
|
|
|
|
+ visible: false,
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+const showDrawer = (item: any) => {
|
|
|
|
+ drawer.key = item.key;
|
|
|
|
+ drawer.header = `${item.label}(${item.key})`;
|
|
|
|
+ drawer.value = deepClone(props.pen[item.key]);
|
|
|
|
+ drawer.placeholder = item.placeholder;
|
|
|
|
+ drawer.randomkey = s8(); //props.pen.id;
|
|
|
|
+ drawer.visible = true;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const onConfirmDrawer = () => {
|
|
|
|
+ if (!drawer.value) {
|
|
|
|
+ MessagePlugin.error('数据不满足json格式');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ props.pen[drawer.key] = drawer.value;
|
|
|
|
+ updatePen(props.pen, drawer.key);
|
|
|
|
+};
|
|
|
|
+</script>
|
|
|
|
+<style lang="postcss" scoped></style>
|