|  | @@ -1,4 +1,4 @@
 | 
	
		
			
				|  |  | -import { defineComponent, nextTick, onMounted, reactive, ref, watch } from "vue";
 | 
	
		
			
				|  |  | +import { defineComponent, nextTick, onMounted, onUnmounted, reactive, ref, watch } from "vue";
 | 
	
		
			
				|  |  |  import styles from "./index.module.less";
 | 
	
		
			
				|  |  |  import { NButton, NCheckbox, NRadio, NSpace, NSpin, useDialog } from "naive-ui";
 | 
	
		
			
				|  |  |  import { getImage } from "../home/images";
 | 
	
	
		
			
				|  | @@ -7,170 +7,185 @@ import { storeData } from "/src/store";
 | 
	
		
			
				|  |  |  import { api_musicSheetCreationPage, api_musicSheetCreationRemove } from "../api";
 | 
	
		
			
				|  |  |  import { useRouter } from "vue-router";
 | 
	
		
			
				|  |  |  import ABCJS from "abcjs";
 | 
	
		
			
				|  |  | -import { usePageVisibility } from '@vant/use'
 | 
	
		
			
				|  |  | +import { usePageVisibility } from "@vant/use";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  export default defineComponent({
 | 
	
		
			
				|  |  | -	name: "Create",
 | 
	
		
			
				|  |  | -	setup() {
 | 
	
		
			
				|  |  | -		const router = useRouter();
 | 
	
		
			
				|  |  | -		const dialog = useDialog();
 | 
	
		
			
				|  |  | -		console.log(storeData.user);
 | 
	
		
			
				|  |  | -		const forms = reactive({
 | 
	
		
			
				|  |  | -			teacherId: storeData.user.id,
 | 
	
		
			
				|  |  | -			page: 1,
 | 
	
		
			
				|  |  | -			keyword: "",
 | 
	
		
			
				|  |  | -			rows: 20,
 | 
	
		
			
				|  |  | -		});
 | 
	
		
			
				|  |  | -		const data = reactive({
 | 
	
		
			
				|  |  | -			list: [] as any[],
 | 
	
		
			
				|  |  | -			addShow: false,
 | 
	
		
			
				|  |  | -			loading: false,
 | 
	
		
			
				|  |  | -			finish: false,
 | 
	
		
			
				|  |  | -			isCreated: false,
 | 
	
		
			
				|  |  | -		});
 | 
	
		
			
				|  |  | -		const getList = async () => {
 | 
	
		
			
				|  |  | -			data.loading = true;
 | 
	
		
			
				|  |  | -			const res = await api_musicSheetCreationPage({ ...forms });
 | 
	
		
			
				|  |  | -			if (res?.code == 200) {
 | 
	
		
			
				|  |  | -				if (data.isCreated) {
 | 
	
		
			
				|  |  | -					data.isCreated = false;
 | 
	
		
			
				|  |  | -					handleOpenNotaion(res.data.rows[0]);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				data.list = data.list.concat(res.data.rows);
 | 
	
		
			
				|  |  | -				data.finish = res.data.rows.length < forms.rows;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			data.loading = false;
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  | -		const handleReset = () => {
 | 
	
		
			
				|  |  | -			forms.page = 1;
 | 
	
		
			
				|  |  | -			data.finish = false;
 | 
	
		
			
				|  |  | -			data.list = [];
 | 
	
		
			
				|  |  | -			getList();
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  | -		const pageVisibility = usePageVisibility();
 | 
	
		
			
				|  |  | -		watch(pageVisibility, (val) => {
 | 
	
		
			
				|  |  | -			if (val === 'visible') {
 | 
	
		
			
				|  |  | -				handleReset();
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		})
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		const handleDelte = (item: any) => {
 | 
	
		
			
				|  |  | -			const checked = ref(true);
 | 
	
		
			
				|  |  | -			dialog.warning({
 | 
	
		
			
				|  |  | -				autoFocus: false,
 | 
	
		
			
				|  |  | -				class: "deleteDialog",
 | 
	
		
			
				|  |  | -				title: "删除曲谱",
 | 
	
		
			
				|  |  | -				// content: () => (
 | 
	
		
			
				|  |  | -				// 	<div onClick={() => checked.value = !checked.value}>
 | 
	
		
			
				|  |  | -				// 		<NRadio checked={checked.value}>同步删除我的资源中的该曲目</NRadio>
 | 
	
		
			
				|  |  | -				// 	</div>
 | 
	
		
			
				|  |  | -				// ),
 | 
	
		
			
				|  |  | -				content: () => <div style={{paddingRight: 'calc(var(--n-close-size) + 6px)'}}>确认删除当前曲谱?</div>,
 | 
	
		
			
				|  |  | -				positiveText: "取消",
 | 
	
		
			
				|  |  | -				positiveButtonProps: {
 | 
	
		
			
				|  |  | -					type: "default",
 | 
	
		
			
				|  |  | -				},
 | 
	
		
			
				|  |  | -				negativeText: "删除",
 | 
	
		
			
				|  |  | -				negativeButtonProps: {
 | 
	
		
			
				|  |  | -					type: "primary",
 | 
	
		
			
				|  |  | -					ghost: false,
 | 
	
		
			
				|  |  | -				},
 | 
	
		
			
				|  |  | -				onPositiveClick: () => {},
 | 
	
		
			
				|  |  | -				onNegativeClick: async () => {
 | 
	
		
			
				|  |  | -					await api_musicSheetCreationRemove(item.id);
 | 
	
		
			
				|  |  | -					handleReset();
 | 
	
		
			
				|  |  | -				},
 | 
	
		
			
				|  |  | -			});
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  | -		const loadingRef = ref();
 | 
	
		
			
				|  |  | -		onMounted(() => {
 | 
	
		
			
				|  |  | -			getList();
 | 
	
		
			
				|  |  | -			if (loadingRef.value) {
 | 
	
		
			
				|  |  | -				const obv = new IntersectionObserver((entries) => {
 | 
	
		
			
				|  |  | -					if (entries[0].isIntersecting) {
 | 
	
		
			
				|  |  | -						if (data.finish || data.loading) return;
 | 
	
		
			
				|  |  | -						forms.page++;
 | 
	
		
			
				|  |  | -						getList();
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				});
 | 
	
		
			
				|  |  | -				obv.observe(loadingRef.value?.$el);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		});
 | 
	
		
			
				|  |  | -		const handleOpenNotaion = (item: any) => {
 | 
	
		
			
				|  |  | -			window.parent.postMessage(
 | 
	
		
			
				|  |  | -				{
 | 
	
		
			
				|  |  | -					api: "notation_open",
 | 
	
		
			
				|  |  | -					url: `${location.origin}/notation/#/?v=1.0.2&id=${item.id}`,
 | 
	
		
			
				|  |  | -				},
 | 
	
		
			
				|  |  | -				"*"
 | 
	
		
			
				|  |  | -			);
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  | -		const productSvg = (abc: string, id: string) => {
 | 
	
		
			
				|  |  | -			if (abc) {
 | 
	
		
			
				|  |  | -				const a = ABCJS.renderAbc(id, abc, { selectTypes: false, add_classes: true });
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		};
 | 
	
		
			
				|  |  | -		return () => (
 | 
	
		
			
				|  |  | -			<div class={styles.wrap}>
 | 
	
		
			
				|  |  | -				<NSpace size={18}>
 | 
	
		
			
				|  |  | -					<div class={styles.createItem} onClick={() => (data.addShow = true)}>
 | 
	
		
			
				|  |  | -						<img src={getImage("icon_29.png")} />
 | 
	
		
			
				|  |  | -						<div>新建乐谱</div>
 | 
	
		
			
				|  |  | -					</div>
 | 
	
		
			
				|  |  | +  name: "Create",
 | 
	
		
			
				|  |  | +  setup() {
 | 
	
		
			
				|  |  | +    const router = useRouter();
 | 
	
		
			
				|  |  | +    const dialog = useDialog();
 | 
	
		
			
				|  |  | +    console.log(storeData.user);
 | 
	
		
			
				|  |  | +    const forms = reactive({
 | 
	
		
			
				|  |  | +      teacherId: storeData.user.id,
 | 
	
		
			
				|  |  | +      page: 1,
 | 
	
		
			
				|  |  | +      keyword: "",
 | 
	
		
			
				|  |  | +      rows: 20,
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const data = reactive({
 | 
	
		
			
				|  |  | +      list: [] as any[],
 | 
	
		
			
				|  |  | +      addShow: false,
 | 
	
		
			
				|  |  | +      loading: false,
 | 
	
		
			
				|  |  | +      finish: false,
 | 
	
		
			
				|  |  | +      isCreated: false,
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const getList = async () => {
 | 
	
		
			
				|  |  | +      data.loading = true;
 | 
	
		
			
				|  |  | +      const res = await api_musicSheetCreationPage({ ...forms });
 | 
	
		
			
				|  |  | +      if (res?.code == 200) {
 | 
	
		
			
				|  |  | +        if (data.isCreated) {
 | 
	
		
			
				|  |  | +          data.isCreated = false;
 | 
	
		
			
				|  |  | +          handleOpenNotaion(res.data.rows[0]);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        data.list = data.list.concat(res.data.rows);
 | 
	
		
			
				|  |  | +        data.finish = res.data.rows.length < forms.rows;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      data.loading = false;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const handleReset = () => {
 | 
	
		
			
				|  |  | +      forms.page = 1;
 | 
	
		
			
				|  |  | +      data.finish = false;
 | 
	
		
			
				|  |  | +      data.list = [];
 | 
	
		
			
				|  |  | +      getList();
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const pageVisibility = usePageVisibility();
 | 
	
		
			
				|  |  | +    watch(pageVisibility, (val) => {
 | 
	
		
			
				|  |  | +      if (val === "visible") {
 | 
	
		
			
				|  |  | +        handleReset();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -					{data.list.map((item, index: number) => (
 | 
	
		
			
				|  |  | -						<div class={styles.item} onClick={() => handleOpenNotaion(item)}>
 | 
	
		
			
				|  |  | -							<div class={styles.imgBox} id={"item_" + index}>
 | 
	
		
			
				|  |  | -								<img
 | 
	
		
			
				|  |  | -									src={getImage("icon_staff.png")}
 | 
	
		
			
				|  |  | -									onLoad={() => {
 | 
	
		
			
				|  |  | -										productSvg(item.creationConfig, "item_" + index);
 | 
	
		
			
				|  |  | -									}}
 | 
	
		
			
				|  |  | -								/>
 | 
	
		
			
				|  |  | -							</div>
 | 
	
		
			
				|  |  | -							<div class={styles.itemBottom}>
 | 
	
		
			
				|  |  | -								<div class={styles.bottombox}>
 | 
	
		
			
				|  |  | -									<div class={styles.bottomLeft}>
 | 
	
		
			
				|  |  | -										<div class={styles.itemtitle}>
 | 
	
		
			
				|  |  | -											<img class={styles.icon_29} src={getImage("icon_29_1.png")} />
 | 
	
		
			
				|  |  | -											<span>{item.name}</span>
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -										<div class={styles.time}>{item.updateTime}</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -									{/* <img
 | 
	
		
			
				|  |  | +    const handleDelte = (item: any) => {
 | 
	
		
			
				|  |  | +      const checked = ref(true);
 | 
	
		
			
				|  |  | +      dialog.warning({
 | 
	
		
			
				|  |  | +        autoFocus: false,
 | 
	
		
			
				|  |  | +        class: "deleteDialog",
 | 
	
		
			
				|  |  | +        title: "删除曲谱",
 | 
	
		
			
				|  |  | +        // content: () => (
 | 
	
		
			
				|  |  | +        // 	<div onClick={() => checked.value = !checked.value}>
 | 
	
		
			
				|  |  | +        // 		<NRadio checked={checked.value}>同步删除我的资源中的该曲目</NRadio>
 | 
	
		
			
				|  |  | +        // 	</div>
 | 
	
		
			
				|  |  | +        // ),
 | 
	
		
			
				|  |  | +        content: () => <div style={{ paddingRight: "calc(var(--n-close-size) + 6px)" }}>确认删除当前曲谱?</div>,
 | 
	
		
			
				|  |  | +        positiveText: "取消",
 | 
	
		
			
				|  |  | +        positiveButtonProps: {
 | 
	
		
			
				|  |  | +          type: "default",
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        negativeText: "删除",
 | 
	
		
			
				|  |  | +        negativeButtonProps: {
 | 
	
		
			
				|  |  | +          type: "primary",
 | 
	
		
			
				|  |  | +          ghost: false,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        onPositiveClick: () => {},
 | 
	
		
			
				|  |  | +        onNegativeClick: async () => {
 | 
	
		
			
				|  |  | +          await api_musicSheetCreationRemove(item.id);
 | 
	
		
			
				|  |  | +          handleReset();
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const loadingRef = ref();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const messageEvent = (params?: any) => {
 | 
	
		
			
				|  |  | +      // 在老师端里面关闭要刷新
 | 
	
		
			
				|  |  | +      if (params.data?.api == "reload") {
 | 
	
		
			
				|  |  | +        handleReset();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    onMounted(() => {
 | 
	
		
			
				|  |  | +      getList();
 | 
	
		
			
				|  |  | +      if (loadingRef.value) {
 | 
	
		
			
				|  |  | +        const obv = new IntersectionObserver((entries) => {
 | 
	
		
			
				|  |  | +          if (entries[0].isIntersecting) {
 | 
	
		
			
				|  |  | +            if (data.finish || data.loading) return;
 | 
	
		
			
				|  |  | +            forms.page++;
 | 
	
		
			
				|  |  | +            getList();
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        obv.observe(loadingRef.value?.$el);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      window.addEventListener("message", (params?: any) => {
 | 
	
		
			
				|  |  | +        messageEvent(params);
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onUnmounted(() => {
 | 
	
		
			
				|  |  | +      window.removeEventListener("message", messageEvent);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const handleOpenNotaion = (item: any) => {
 | 
	
		
			
				|  |  | +      window.parent.postMessage(
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          api: "notation_open",
 | 
	
		
			
				|  |  | +          url: `${location.origin}/notation/#/?v=1.0.2&id=${item.id}`,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        "*"
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const productSvg = (abc: string, id: string) => {
 | 
	
		
			
				|  |  | +      if (abc) {
 | 
	
		
			
				|  |  | +        const a = ABCJS.renderAbc(id, abc, { selectTypes: false, add_classes: true });
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <div class={styles.wrap}>
 | 
	
		
			
				|  |  | +        <NSpace size={18}>
 | 
	
		
			
				|  |  | +          <div class={styles.createItem} onClick={() => (data.addShow = true)}>
 | 
	
		
			
				|  |  | +            <img src={getImage("icon_29.png")} />
 | 
	
		
			
				|  |  | +            <div>新建乐谱</div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          {data.list.map((item, index: number) => (
 | 
	
		
			
				|  |  | +            <div class={styles.item} onClick={() => handleOpenNotaion(item)}>
 | 
	
		
			
				|  |  | +              <div class={styles.imgBox} id={"item_" + index}>
 | 
	
		
			
				|  |  | +                <img
 | 
	
		
			
				|  |  | +                  src={getImage("icon_staff.png")}
 | 
	
		
			
				|  |  | +                  onLoad={() => {
 | 
	
		
			
				|  |  | +                    productSvg(item.creationConfig, "item_" + index);
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div class={styles.itemBottom}>
 | 
	
		
			
				|  |  | +                <div class={styles.bottombox}>
 | 
	
		
			
				|  |  | +                  <div class={styles.bottomLeft}>
 | 
	
		
			
				|  |  | +                    <div class={styles.itemtitle}>
 | 
	
		
			
				|  |  | +                      <img class={styles.icon_29} src={getImage("icon_29_1.png")} />
 | 
	
		
			
				|  |  | +                      <span>{item.name}</span>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                    <div class={styles.time}>{item.updateTime}</div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                  {/* <img
 | 
	
		
			
				|  |  |  										style={{ pointerEvents: "none", opacity: 0.3 }}
 | 
	
		
			
				|  |  |  										class={styles.bottomBtn}
 | 
	
		
			
				|  |  |  										src={getImage("icon_29_2.png")}
 | 
	
		
			
				|  |  |  									/> */}
 | 
	
		
			
				|  |  | -									<img
 | 
	
		
			
				|  |  | -										class={styles.bottomBtn}
 | 
	
		
			
				|  |  | -										src={getImage("icon_29_3.png")}
 | 
	
		
			
				|  |  | -										onClick={(e: Event) => {
 | 
	
		
			
				|  |  | -											e.stopPropagation();
 | 
	
		
			
				|  |  | -											handleDelte(item);
 | 
	
		
			
				|  |  | -										}}
 | 
	
		
			
				|  |  | -									/>
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</div>
 | 
	
		
			
				|  |  | -							{/* <img class={styles.btn} src={getImage("icon_29_4.png")} /> */}
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -					))}
 | 
	
		
			
				|  |  | -				</NSpace>
 | 
	
		
			
				|  |  | -				{!data.finish && (
 | 
	
		
			
				|  |  | -					<NSpace ref={loadingRef} justify="center" style={{ padding: "30px" }}>
 | 
	
		
			
				|  |  | -						<NSpin size="large" />
 | 
	
		
			
				|  |  | -					</NSpace>
 | 
	
		
			
				|  |  | -				)}
 | 
	
		
			
				|  |  | +                  <img
 | 
	
		
			
				|  |  | +                    class={styles.bottomBtn}
 | 
	
		
			
				|  |  | +                    src={getImage("icon_29_3.png")}
 | 
	
		
			
				|  |  | +                    onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                      e.stopPropagation();
 | 
	
		
			
				|  |  | +                      handleDelte(item);
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                  />
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              {/* <img class={styles.btn} src={getImage("icon_29_4.png")} /> */}
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          ))}
 | 
	
		
			
				|  |  | +        </NSpace>
 | 
	
		
			
				|  |  | +        {!data.finish && (
 | 
	
		
			
				|  |  | +          <NSpace ref={loadingRef} justify="center" style={{ padding: "30px" }}>
 | 
	
		
			
				|  |  | +            <NSpin size="large" />
 | 
	
		
			
				|  |  | +          </NSpace>
 | 
	
		
			
				|  |  | +        )}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -				<TheCreate
 | 
	
		
			
				|  |  | -					v-model:show={data.addShow}
 | 
	
		
			
				|  |  | -					onCreate={() => {
 | 
	
		
			
				|  |  | -						data.addShow = false;
 | 
	
		
			
				|  |  | -						data.isCreated = true;
 | 
	
		
			
				|  |  | -						handleReset();
 | 
	
		
			
				|  |  | -					}}
 | 
	
		
			
				|  |  | -				/>
 | 
	
		
			
				|  |  | -			</div>
 | 
	
		
			
				|  |  | -		);
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | +        <TheCreate
 | 
	
		
			
				|  |  | +          v-model:show={data.addShow}
 | 
	
		
			
				|  |  | +          onCreate={() => {
 | 
	
		
			
				|  |  | +            data.addShow = false;
 | 
	
		
			
				|  |  | +            data.isCreated = true;
 | 
	
		
			
				|  |  | +            handleReset();
 | 
	
		
			
				|  |  | +          }}
 | 
	
		
			
				|  |  | +        />
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  |  });
 |