138 lines
2.8 KiB
Vue
138 lines
2.8 KiB
Vue
<template>
|
||
<section class="demo-section">
|
||
<div class="section-heading">
|
||
<div>
|
||
<p class="eyebrow">通知场景</p>
|
||
<h2>通知编辑与预览</h2>
|
||
<p>Notify 组件复用文章编辑器,同时保留通知自己的元数据。</p>
|
||
</div>
|
||
<t-button size="small" theme="primary" @click="submitNotify">提交通知</t-button>
|
||
</div>
|
||
|
||
<div class="demo-grid">
|
||
<article class="demo-card">
|
||
<div class="card-heading">
|
||
<h3>NotifyEditor</h3>
|
||
<span v-text="notifyStatus" />
|
||
</div>
|
||
<t-input v-model="notifyValue.subject" class="subject-input" placeholder="通知标题" />
|
||
<notify-editor
|
||
ref="notifyEditorRef"
|
||
:model-value="notifyValue"
|
||
:upload-image="uploadDemoMedia"
|
||
:upload-video="uploadDemoMedia"
|
||
@change="onNotifyChange"
|
||
@update:model-value="onNotifyChange"
|
||
/>
|
||
</article>
|
||
|
||
<article class="demo-card">
|
||
<div class="card-heading">
|
||
<h3>NotifyView</h3>
|
||
<span v-text="notifyValue.status" />
|
||
</div>
|
||
<notify-view :detail="notifyValue" />
|
||
</article>
|
||
</div>
|
||
</section>
|
||
</template>
|
||
|
||
<script lang="ts" setup>
|
||
import {
|
||
NotifyEditor,
|
||
NotifyView
|
||
} from "timi-tdesign-pc";
|
||
import type { NotifyEditorExpose } from "timi-tdesign-pc";
|
||
import type { NotifyDetail } from "timi-web/editor";
|
||
import { cloneNotify, uploadDemoMedia } from "../demo-data";
|
||
|
||
const notifyValue = ref<NotifyDetail>(cloneNotify());
|
||
const notifyEditorRef = ref<NotifyEditorExpose>();
|
||
const notifyStatus = ref("等待提交");
|
||
|
||
function onNotifyChange(value: NotifyDetail) {
|
||
notifyValue.value = value;
|
||
}
|
||
|
||
async function submitNotify() {
|
||
const value = await notifyEditorRef.value?.submit();
|
||
if (value) {
|
||
notifyValue.value = value;
|
||
notifyStatus.value = `已提交,${value.content?.length || 0} 个字符`;
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="less" scoped>
|
||
.demo-section {
|
||
.section-heading {
|
||
align-items: flex-end;
|
||
display: flex;
|
||
gap: 1rem;
|
||
justify-content: space-between;
|
||
margin-bottom: 1rem;
|
||
|
||
h2 {
|
||
margin: .25rem 0;
|
||
}
|
||
|
||
p {
|
||
margin: 0;
|
||
color: var(--td-text-color-secondary);
|
||
}
|
||
}
|
||
|
||
.eyebrow {
|
||
font-size: .75rem;
|
||
letter-spacing: .08em;
|
||
text-transform: uppercase;
|
||
color: var(--td-brand-color);
|
||
}
|
||
|
||
.card-heading {
|
||
align-items: center;
|
||
display: flex;
|
||
gap: .5rem;
|
||
justify-content: space-between;
|
||
|
||
h3 {
|
||
margin: 0;
|
||
}
|
||
|
||
span {
|
||
font-size: .75rem;
|
||
color: var(--td-text-color-secondary);
|
||
}
|
||
}
|
||
|
||
.demo-grid {
|
||
display: grid;
|
||
gap: 1rem;
|
||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||
}
|
||
|
||
.demo-card {
|
||
padding: 1rem;
|
||
border: 1px solid var(--td-component-border);
|
||
border-radius: .75rem;
|
||
background: var(--td-bg-color-container);
|
||
}
|
||
|
||
.subject-input {
|
||
margin: 1rem 0;
|
||
}
|
||
|
||
@media (max-width: 48rem) {
|
||
.section-heading,
|
||
.card-heading {
|
||
align-items: flex-start;
|
||
flex-direction: column;
|
||
}
|
||
|
||
.demo-grid {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
}
|
||
}
|
||
</style>
|