A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang. (PERSONAL FORK)
at lambda-fork/main 136 lines 6.8 kB view raw
1import * as dayjs from "dayjs"; 2import {genCellValueByElement, updateCellsValue} from "./cell"; 3 4export const getDateHTML = (cellElements: HTMLElement[]) => { 5 const cellValue = genCellValueByElement("date", cellElements[0]).date; 6 const isNotTime = cellValue.isNotTime; 7 let value = ""; 8 const currentDate = new Date().getTime(); 9 if (cellValue.isNotEmpty) { 10 value = dayjs(cellValue.content).format(isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm"); 11 const year = value.split("-")[0]; 12 if (year.length !== 4) { 13 value = new Array(4 - year.length).fill(0).join("") + value; 14 } 15 } else { 16 value = dayjs(currentDate).format(isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm"); 17 } 18 let value2 = ""; 19 if (cellValue.isNotEmpty2) { 20 value2 = dayjs(cellValue.content2).format(isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm"); 21 const year = value2.split("-")[0]; 22 if (year.length !== 4) { 23 value2 = new Array(4 - year.length).fill(0).join("") + value2; 24 } 25 } else if (cellValue.hasEndDate) { 26 value2 = dayjs(currentDate).format(isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm"); 27 } 28 return `<div class="b3-menu__items"> 29<div> 30 <input type="${isNotTime ? "date" : "datetime-local"}" max="${isNotTime ? "9999-12-31" : "9999-12-31 23:59"}" value="${value}" data-value="${dayjs(cellValue.content || currentDate).format("YYYY-MM-DD HH:mm")}" class="b3-text-field fn__size200" style="margin-top: 4px;"><br> 31 <input type="${isNotTime ? "date" : "datetime-local"}" max="${isNotTime ? "9999-12-31" : "9999-12-31 23:59"}" value="${value2}" data-value="${cellValue.isNotEmpty2 ? dayjs(cellValue.content2).format("YYYY-MM-DD HH:mm") : ""}" style="margin-top: 8px;margin-bottom: 4px" class="b3-text-field fn__size200${cellValue.hasEndDate ? "" : " fn__none"}"> 32 <button class="b3-menu__separator"></button> 33 <label class="b3-menu__item"> 34 <span class="fn__flex-center">${window.siyuan.languages.endDate}</span> 35 <span class="fn__space fn__flex-1"></span> 36 <input type="checkbox" class="b3-switch b3-switch--menu"${cellValue.hasEndDate ? " checked" : ""}> 37 </label> 38 <label class="b3-menu__item"> 39 <span class="fn__flex-center">${window.siyuan.languages.includeTime}</span> 40 <span class="fn__space fn__flex-1"></span> 41 <input type="checkbox" class="b3-switch b3-switch--menu"${isNotTime ? "" : " checked"}> 42 </label> 43 <button class="b3-menu__separator"></button> 44 <button class="b3-menu__item" data-type="clearDate"> 45 <svg class="b3-menu__icon"><use xlink:href="#iconTrashcan"></use></svg> 46 <span class="b3-menu__label">${window.siyuan.languages.clear}</span> 47 </button> 48</div> 49</div>`; 50}; 51 52export const bindDateEvent = (options: { 53 protyle: IProtyle, 54 data: IAV, 55 menuElement: HTMLElement, 56 blockElement: Element, 57 cellElements: HTMLElement[] 58}) => { 59 const inputElements: NodeListOf<HTMLInputElement> = options.menuElement.querySelectorAll("input"); 60 inputElements.forEach(item => { 61 item.addEventListener("keydown", (event) => { 62 if (event.isComposing) { 63 return; 64 } 65 if (event.key === "Enter") { 66 updateCellsValue(options.protyle, options.blockElement as HTMLElement, { 67 content: getFullYearTime(inputElements[0].dataset.value) || 0, 68 isNotEmpty: inputElements[0].value !== "", 69 content2: getFullYearTime(inputElements[1].dataset.value) || 0, 70 isNotEmpty2: inputElements[1].value !== "", 71 hasEndDate: inputElements[2].checked, 72 isNotTime: !inputElements[3].checked, 73 }, options.cellElements); 74 document.querySelector(".av__panel")?.dispatchEvent(new CustomEvent("click", {detail: "close"})); 75 } 76 }); 77 }); 78 inputElements[0].addEventListener("change", () => { 79 inputElements[0].dataset.value = inputElements[0].value.length > 10 ? inputElements[0].value : inputElements[0].value + " 00:00"; 80 }); 81 inputElements[1].addEventListener("change", () => { 82 inputElements[1].dataset.value = inputElements[1].value.length > 10 ? inputElements[1].value : inputElements[1].value + " 00:00"; 83 }); 84 inputElements[2].addEventListener("change", () => { 85 if (inputElements[2].checked) { 86 if (!inputElements[1].dataset.value) { 87 const currentDate = new Date().getTime(); 88 inputElements[1].dataset.value = dayjs(currentDate).format("YYYY-MM-DD HH:mm"); 89 inputElements[1].value = dayjs(currentDate).format(inputElements[3].checked ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD"); 90 } 91 inputElements[1].classList.remove("fn__none"); 92 } else { 93 inputElements[1].classList.add("fn__none"); 94 } 95 }); 96 inputElements[3].addEventListener("change", () => { 97 inputElements[0].value = ""; 98 inputElements[1].value = ""; 99 if (inputElements[3].checked) { 100 inputElements[0].setAttribute("type", "datetime-local"); 101 inputElements[1].setAttribute("type", "datetime-local"); 102 inputElements[0].setAttribute("max", "9999-12-31 23:59"); 103 inputElements[1].setAttribute("max", "9999-12-31 23:59"); 104 inputElements[0].value = inputElements[0].dataset.value; 105 inputElements[1].value = inputElements[1].dataset.value; 106 } else { 107 inputElements[0].setAttribute("type", "date"); 108 inputElements[1].setAttribute("type", "date"); 109 inputElements[0].setAttribute("max", "9999-12-31"); 110 inputElements[1].setAttribute("max", "9999-12-31"); 111 inputElements[0].value = inputElements[0].dataset.value.substring(0, 10); 112 inputElements[1].value = inputElements[1].dataset.value.substring(0, 10); 113 } 114 }); 115 return () => { 116 updateCellsValue(options.protyle, options.blockElement as HTMLElement, { 117 content: getFullYearTime(inputElements[0].dataset.value) || 0, 118 isNotEmpty: inputElements[0].value !== "", 119 content2: getFullYearTime(inputElements[1].dataset.value) || 0, 120 isNotEmpty2: inputElements[1].value !== "", 121 hasEndDate: inputElements[2].checked, 122 isNotTime: !inputElements[3].checked, 123 }, options.cellElements); 124 }; 125}; 126 127const getFullYearTime = (dateStr: string) => { 128 const year = dateStr.split("-")[0]; 129 const date = new Date(dateStr); 130 if (year.startsWith("00") || year.startsWith("000") || year.length < 3) { 131 date.setFullYear(parseInt(year)); 132 return date.getTime(); 133 } else { 134 return date.getTime(); 135 } 136};