diff --git a/ismism.ts/ui/bind/article.ts b/ismism.ts/ui/bind/article.ts index 493a18a..015ed4e 100644 --- a/ismism.ts/ui/bind/article.ts +++ b/ismism.ts/ui/bind/article.ts @@ -1,11 +1,12 @@ import type { Id } from "../../src/eid/typ.ts" import type { Pas, PasCode, PreUsr } from "../../src/pra/pos.ts" +import type { DocU } from "../../src/db.ts" import type * as Q from "../../src/pra/que.ts" import { nav, navhash, navpas } from "./nav.ts" -import { bind, main, pos, que } from "./template.ts" +import { bind, main, pas_a, pos, que } from "./template.ts" import { is_actid, is_nbr, lim_re, req_re } from "../../src/eid/is.ts" import { utc_medium } from "../../src/ont/utc.ts" -import { ida, idnam, label, meta, pro, rolref, seladm } from "./section.ts" +import { btn, ida, idnam, label, meta, pro, rolref, seladm, txt } from "./section.ts" import { is_pro_usr, is_sec } from "../../src/pra/con.ts" export function pas( @@ -100,6 +101,7 @@ export async function usr( if (nav.pas) { if (nav.pas.uid === uid) { + pas_a.innerText = u.nam t.put.addEventListener("click", () => put("用户", u)) t.pas.addEventListener("click", pas) if (nav.pas.aut || is_sec(nav.pas)) { @@ -147,11 +149,72 @@ function pre( ) { } + function put( - t: "用户" | "社团" | "活动", + nam: "用户" | "社团" | "活动", id: Usr, ) { + if (!nav.pas) return + main.innerHTML = "" + const t = bind("put") + + idnam(t, `${id._id}`, `编辑${nam}信息`) + t.pnam.value = id.nam + seladm(t, id.adm1, id.adm2) + txt(t.intro, "简介", id.intro) + + const pid = () => ({ nam: t.pnam.value, adm1: t.adm1.value, adm2: t.adm2.value, }) + const paut = () => ({ uidlim: parseInt(t.uidlim.value) }) + const psoc = () => ({ intro: t.intro.value.trim(), reslim: parseInt(t.reslim.value) }) + const pagd = () => ({ + account: t.account.value.trim(), budget: parseInt(t.budget.value), + fund: parseInt(t.fund.value), expense: parseInt(t.expense.value) + }) + // deno-lint-ignore no-explicit-any + let p: () => any[] + let r + switch (nam) { + case "用户": { + [t.uidlim, t.reslim, t.account, t.budget, t.fund, t.expense].forEach(el => el.parentElement?.remove()) + p = () => [{ uid: id._id, ...pid(), intro: t.intro.value.trim() }] + r = () => usr(id._id) + break + } case "社团": { + [t.account, t.budget, t.fund, t.expense].forEach(el => el.parentElement?.remove()) + const [isaut, issec] = [nav.pas.aut, is_sec(nav.pas, { sid: id._id })] + if (!nav.pas.aut) t.intro.readOnly = t.uidlim.readOnly = true + if (!issec) t.pnam.readOnly = t.adm1.disabled = t.adm2.disabled = t.uidlim.readOnly = true + p = () => [ + ...isaut ? [{ sid: id._id, ...pid(), ...paut() }] : [], + ...issec ? [{ sid: id._id, ...psoc() }] : [], + ] + r = () => soc(id._id) + break + } case "活动": { + const [isaut, issec] = [nav.pas.aut, is_sec(nav.pas, { aid: id._id })] + if (!nav.pas.aut) t.intro.readOnly = t.uidlim.readOnly = true + if (!issec) t.pnam.readOnly = t.adm1.disabled = t.adm2.disabled = t.uidlim.readOnly = true + p = () => [ + ...isaut ? [{ aid: id._id, ...pid(), ...paut() }] : [], + ...issec ? [{ aid: id._id, ...psoc(), ...pagd() }] : [], + ] + r = () => agd(id._id) + break + } + } + btn(t.put, t.put.innerText, { + pos: async () => { + const rs = await Promise.all(p().map(b => pos("put", b))) + return rs.some(r => r === null) ? null : 1 + }, + alert: "无效输入\n或名称已被占用", + refresh: r, + }) + t.cancel.addEventListener("click", r) + + main.append(t.bind) } + export function idn( id: string, nam: string ) { diff --git a/ismism.ts/ui/bind/section.ts b/ismism.ts/ui/bind/section.ts index ddc1023..ec00811 100644 --- a/ismism.ts/ui/bind/section.ts +++ b/ismism.ts/ui/bind/section.ts @@ -13,6 +13,20 @@ export function label( l.innerText = s } +export function txt( + t: HTMLTextAreaElement, + n: string, + s?: string, +) { + if (s) t.value = s + t.addEventListener("input", () => { + label(t, `${n}:(${t.value.length}/${t.maxLength} 个字符)`) + t.style.height = "auto" + t.style.height = `${t.scrollHeight}px` + }) + if (s) setTimeout(() => t.dispatchEvent(new Event("input")), 50) +} + function selopt( sel: HTMLSelectElement, opt: Iterable, diff --git a/ismism.ts/ui/bind/template.ts b/ismism.ts/ui/bind/template.ts index 79769a2..aaeda99 100644 --- a/ismism.ts/ui/bind/template.ts +++ b/ismism.ts/ui/bind/template.ts @@ -69,6 +69,17 @@ const template = { ...section.pro, }, + put: { + tid: "put" as const, + ...section.idnam, + pnam: t("input"), + ...section.seladm, + intro: t("textarea"), + uidlim: t("input"), reslim: t("input"), + account: t("input"), budget: t("input"), fund: t("input"), expense: t("input"), + put: t("button"), cancel: t("button"), + }, + idn: { tid: "idn" as const, id: t("code"), meta: t("section"), diff --git a/ismism.ts/ui/index/template.html b/ismism.ts/ui/index/template.html index 53f1b9e..a0979ed 100644 --- a/ismism.ts/ui/index/template.html +++ b/ismism.ts/ui/index/template.html @@ -97,6 +97,68 @@ + +