@gzmjs/form 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/040-input/00-common.d.ts +18 -0
- package/dist/040-input/01-input.d.ts +122 -0
- package/dist/040-input/03-label.d.ts +38 -0
- package/dist/040-input/06-text.d.ts +57 -0
- package/dist/040-input/09-cal.d.ts +65 -0
- package/dist/040-input/12-check.d.ts +33 -0
- package/dist/040-input/15-num.d.ts +50 -0
- package/dist/040-input/18-color.d.ts +41 -0
- package/dist/040-input/21-lines.d.ts +53 -0
- package/dist/040-input/24-comboItem.d.ts +31 -0
- package/dist/040-input/25-comboList.d.ts +27 -0
- package/dist/040-input/26-combo.d.ts +40 -0
- package/dist/040-input/27-checklist.d.ts +36 -0
- package/dist/040-input/30-search-list.d.ts +50 -0
- package/dist/040-input/94.form.d.ts +15 -0
- package/dist/040-input/95-form-input.d.ts +51 -0
- package/dist/040-input/96-form-group.d.ts +39 -0
- package/dist/040-input/97-form-list.d.ts +38 -0
- package/dist/form.es.js +3137 -0
- package/dist/form.es.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/package.json +30 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.es.js","sources":["../src/040-input/00-common.ts","../src/040-input/01-input.ts","../src/040-input/03-label.ts","../src/040-input/06-text.ts","../src/040-input/09-cal.ts","../src/040-input/12-check.ts","../src/040-input/15-num.ts","../src/040-input/18-color.ts","../src/040-input/21-lines.ts","../src/040-input/24-comboItem.ts","../src/040-input/25-comboList.ts","../src/040-input/26-combo.ts","../src/040-input/27-checklist.ts","../src/040-input/30-search-list.ts","../src/040-input/94.form.ts","../src/040-input/95-form-input.ts","../src/040-input/96-form-group.ts","../src/040-input/97-form-list.ts"],"sourcesContent":["import {createStyleSheet, generateId, getElementRules} from '@gzmjs/ui-basic';\r\n\r\nexport const inputAutoComplete = ['', 'on', 'off'] as const;\r\nexport type InputAutoComplete = typeof inputAutoComplete[number];\r\n\r\nexport function getInputIdForLabel($ipt: HTMLElement) {\r\n if (!$ipt.id) {\r\n $ipt.id = `input-${generateId()}`;\r\n }\r\n return $ipt.id;\r\n}\r\n/**\r\n * 主要对绑定多个字段的情况进行处理:\r\n * 假设绑定了 2 个字段,且没有选中项,这时 dataValue = [null, null],这时应该返回 ''。\r\n * 但是 toString() 之后是 ',',所以下面用了一个正则表达式判断 ret 中是否全是逗号。\r\n * \r\n * 测试:042-check-list-test.html 中最后一个 check-list 可以测试这种情况。\r\n * @returns 将作为 this.$.ipt.value 的值。\r\n */\r\nexport function getHiddenValueFromDataValue(dv: unknown): string {\r\n if (!dv && dv !== 0 && dv !== 0n) {\r\n return '';\r\n }\r\n if (Array.isArray(dv)) {\r\n return dv.map(x => getHiddenValueFromDataValue(x)).join('');\r\n }\r\n const ret = String(dv);\r\n if (ret.length > 0) {\r\n const regex = /^,+$/;\r\n if (regex.test(ret)) {\r\n return '';\r\n }\r\n }\r\n return ret;\r\n}\r\n\r\n//#region 零宽字符(Zero Width Characters)\r\nconst ZWCs = [\r\n '\\u200B', //零宽空格\r\n '\\u200C', //零宽非连接符\r\n '\\u200D', //零宽连接符\r\n '\\u200E', //左向标记\r\n '\\u200F', //右向标记\r\n '\\u202A', //左到右嵌入\r\n '\\u202B', //右到左嵌入\r\n '\\u202C', //取消嵌入\r\n '\\u202D', //左到右覆盖\r\n '\\u202E', //右到左覆盖\r\n '\\u2060', //单词连接符\r\n '\\uFEFF' //零宽非换行空格\r\n];\r\nexport function removeZWC(s: string) {\r\n for (let i = 0; i < ZWCs.length; i++) {\r\n const zwc = ZWCs[i]!;\r\n s = s.replaceAll(zwc, '');\r\n }\r\n return s;\r\n}\r\n//#endregion\r\n\r\n//#region 日期函数\r\nexport function toDateStr(d: Date) {\r\n //https://devdocs.io/html/element/input/date\r\n //https://devdocs.io/html/date_and_time_formats#date_strings\r\n //dateStr2DT的反向操作\r\n const year = d.getFullYear();\r\n let month: string | number = d.getMonth() + 1;\r\n if (month < 10) {\r\n month = '0' + month;\r\n }\r\n let day: string | number = d.getDate();\r\n if (day < 10) {\r\n day = '0' + day;\r\n }\r\n return year + '-' + month + '-' + day;\r\n}\r\nexport function toMonthStr(d: Date) {\r\n const year = d.getFullYear();\r\n let month: string | number = d.getMonth() + 1;\r\n if (month < 10) {\r\n month = '0' + month;\r\n }\r\n return year + '-' + month;\r\n}\r\n/**\r\n * 它是基于 ISO 8601 标准计算周数的。按照这个标准,每年的第一周是包含 1 月 4 日的那个周,而且一周从周一开始,到周日结束。\r\n * 所以年份并不是 date.getFullYear(),而是需要根据日期所在的周四来确定所属的年份。\r\n * 如 2025-12-31 实际上是 2026 年的第一周。\r\n * @param d \r\n * @returns \r\n */\r\nfunction weekOfYear(date: Date) {\r\n // 1. 校验日期有效性\r\n if (isNaN(date.getTime())) {\r\n throw new Error('无效的 Date 对象,请传入合法的日期');\r\n }\r\n\r\n // 克隆日期,避免修改原对象,同时重置时间为 0 点(消除时区/时间偏差)\r\n const cloneDate = new Date(date);\r\n cloneDate.setHours(0, 0, 0, 0);\r\n\r\n // 2. 计算该日期对应的周四(ISO周的核心参考点)\r\n const dayOfWeek = cloneDate.getDay(); // 原生:0=周日,1=周一...6=周六\r\n // 调整为:周一=1,周二=2...周日=7,方便计算\r\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\r\n // 计算到本周四的偏移量(周四=4,所以 4 - 当天的ISO星期数)\r\n const thursdayOffset = 4 - isoDayOfWeek;\r\n const thursday = new Date(cloneDate);\r\n thursday.setDate(cloneDate.getDate() + thursdayOffset);\r\n\r\n // 3. 计算周四所在的年份(即 ISO 周的年份)\r\n const isoYear = thursday.getFullYear();\r\n\r\n // 4. 计算当年第一个周四(确定 ISO 第 1 周的基准)\r\n const firstDayOfYear = new Date(isoYear, 0, 1); // 当年1月1日\r\n const firstDayOfYearWeekday = firstDayOfYear.getDay(); // 1月1日的星期(0=周日)\r\n const firstThursdayOffset = firstDayOfYearWeekday <= 4 \r\n ? 4 - firstDayOfYearWeekday \r\n : 4 - firstDayOfYearWeekday + 7;\r\n const firstThursday = new Date(isoYear, 0, 1 + firstThursdayOffset);\r\n\r\n // 5. 计算当前周四与当年第一个周四的天数差,进而得到周数\r\n const timeDiff = thursday.getTime() - firstThursday.getTime();\r\n const dayDiff = Math.floor(timeDiff / (24 * 60 * 60 * 1000));\r\n const isoWeek = Math.floor(dayDiff / 7) + 1;\r\n\r\n return {\r\n isoYear,\r\n isoWeek,\r\n };\r\n}\r\nexport function toWeekStr(d: Date) {\r\n const {isoYear, isoWeek} = weekOfYear(d);\r\n const paddedWeek = isoWeek.toString().padStart(2, '0');\r\n \r\n //https://devdocs.io/html/element/input/week\r\n return `${isoYear}-W${paddedWeek}`;\r\n}\r\nexport function toTimeStr(d: Date) {\r\n let h: string | number = d.getHours();\r\n if (h < 10) {\r\n h = '0' + h;\r\n }\r\n let m: string | number = d.getMinutes();\r\n if (m < 10) {\r\n m = '0' + m;\r\n }\r\n return `${h}:${m}`; //input[type=time] 有秒的情况下,不支持datalist\r\n}\r\n//#endregion\r\n\r\n//#region 样式\r\nexport const iptStyle = createStyleSheet({\r\n ':host': `\r\n display: inline-flex;\r\n overflow: hidden;\r\n `,\r\n /* flex-direction: column 为了显示 validation-message 在 .ipt 的下方 */\r\n ':host > label': `\r\n flex: auto;\r\n display: flex;\r\n flex-direction: column;\r\n max-width: 100%;\r\n `,\r\n '.ipt': `\r\n flex: auto;\r\n color: inherit;\r\n background-color: transparent;\r\n outline-width: 0px;\r\n border-radius: 0.375rem;\r\n padding-inline: 0.25rem;\r\n resize: none; /*针对 textarea*/\r\n min-width: 0px; /* 破除 input 默认的最小宽度 */\r\n `,\r\n '.ipt:invalid': `\r\n outline-style: dashed;\r\n outline-width: 2px;\r\n outline-color: var(--gzm-error-txt-color);\r\n `,\r\n [`label::after`]: `\r\n content: \"\";\r\n display: none;\r\n `,\r\n [`label:has(.ipt:invalid)::after`]: `\r\n content: attr(validation-message);\r\n font-size: 0.75rem;\r\n color: var(--gzm-error-txt-color);\r\n display: block;\r\n `,\r\n 'input, textarea': getElementRules('input', 'font'), \r\n});\r\n//#endregion","import {generateId, boolAttr, strAttr} from '@gzmjs/ui-basic';\r\nimport {type ViewModel, ViewElement, ObjValue, ObjMember, type ModelEventSubscriber, type ModelItem, onModelEvent, offModelEvent, ListSource, handleModelEvent, type ModelEvent, type ModelItemUpdateEvent} from '@gzmjs/mvvm';\r\nimport { getHiddenValueFromDataValue } from \"./00-common\";\r\n\r\nexport class InputDataSource<T extends object> {\r\n constructor(o: T, vm: ObjMember | string | string[]) {\r\n this.data = o\r\n\r\n if (!(vm instanceof ObjMember)) {\r\n vm = new ObjMember(vm);\r\n }\r\n\r\n this.valueMember = vm;\r\n }\r\n readonly data: T;\r\n readonly valueMember: ObjMember;\r\n\r\n getValue(): ObjValue {\r\n return this.valueMember.getObjValue(this.data);\r\n }\r\n\r\n setValue(v: unknown) {\r\n this.valueMember.setObjValue(this.data, v);\r\n }\r\n\r\n onDataEvent(listener: ModelEventSubscriber): boolean {\r\n const obj = this.data;\r\n if (obj) {\r\n return (obj as ModelItem)[onModelEvent]?.(listener) ?? false;\r\n }\r\n return false;\r\n }\r\n \r\n offDataEvent(listener: ModelEventSubscriber): boolean {\r\n const obj = this.data;\r\n if (obj) {\r\n return (obj as ModelItem)[offModelEvent]?.(listener) ?? false;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport const textAlign = ['start', 'end', 'center'] as const;\r\nexport type LabelTextAlign = typeof textAlign[number];\r\n\r\nexport interface InputOptions<V, E extends InputBase<V, InputOptions<V, E>>> extends ViewModel<E> {\r\n name: string; //不允许空,可以用 valueMember 作为值。\r\n dataSource?: InputDataSource<object>;\r\n listSource?: ListSource<object>;\r\n\r\n /**\r\n * 验证属性,required 表示必须有值,所有组件(除了 input-check)都支持。\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * 无效值的组件,默认显示红色的框,但并不显示具体的错误信息。\r\n * 如果设置为 true,则会在组件下方显示具体的错误信息。\r\n */\r\n showValidityMessage?: boolean;\r\n\r\n /**\r\n * 虽然只是 input-label 使用的属性,但是在 form 中每一个 input 都可以和 label 互相转换。\r\n * 所以作为基础属性。\r\n */\r\n textAlign?: LabelTextAlign;\r\n\r\n /**\r\n * 涉及到 $ipt 的值改变或者验证条件改变时,都会调用此函数。\r\n * 一般而言只有需要调用 setCustomValidity() 的组件才需要实现此函数。\r\n * @param $ipt \r\n * @returns \r\n */\r\n checkValidity?: ($ipt: HTMLInputElement | HTMLTextAreaElement) => void | Promise<void>;\r\n\r\n /**\r\n * 组件 dataValue 改变时调用此函数。\r\n * @param newValue \r\n * @param oldValue \r\n * @returns \r\n */\r\n dataValueChanged?: (newValue: unknown, oldValue: unknown) => void;\r\n}\r\nexport const inputCopyAttributes = {\r\n name: '$ipt',\r\n required: '$ipt',\r\n //disabled: '$ipt', 不需要复制给内部的 $ipt,因为父元素的 disabled 已经足够了。\r\n};\r\n\r\nexport abstract class InputBase<V, T extends InputOptions<V, InputBase<V, T>>> extends ViewElement<T> {\r\n constructor() {\r\n super();\r\n \r\n this.$ipt = this._createInput();\r\n this.#monitorValidity();\r\n this.ei = this.attachInternals();\r\n }\r\n readonly ei: ElementInternals;\r\n readonly $ipt: HTMLInputElement | HTMLTextAreaElement;\r\n protected abstract _createInput(): HTMLInputElement | HTMLTextAreaElement;\r\n protected abstract _showValue(): void;\r\n\r\n //#region 值\r\n get dataValue() {\r\n return this.#dv;\r\n }\r\n set dataValue(val) {\r\n const old = this.#dv;\r\n this.#dv = this._checkValueType(val);\r\n if (Object.is(this.#dv, old)) {\r\n return;\r\n }\r\n this.model?.dataValueChanged?.(this.#dv, old);\r\n this._writeDataSource();\r\n this._setFormValue(); //form 的值与 #dv 同步\r\n this._setIptValue(); //$ipt 的值与 #dv 同步\r\n }\r\n #dv?: V;\r\n\r\n /**\r\n * 在处理与 listSource 相关的操作时需要用到!\r\n */\r\n protected get dsValue(): ObjValue {\r\n let vml = 1;\r\n if (this.dataSource?.valueMember) {\r\n vml = this.dataSource.valueMember.length;\r\n }\r\n return new ObjValue(this.dataValue, vml);\r\n }\r\n\r\n /**\r\n * 对于定义了 dataType 属性的组件,需要将 #dv 转换为 dataType 指定的类型\r\n */\r\n protected _checkValueType(dv: V | undefined): V | undefined {\r\n const dt = Reflect.get(this, 'dataType');\r\n if (dt) {\r\n if (!Array.isArray(dt)) {\r\n return this._changeValue2Type(dv, dt);\r\n }\r\n\r\n if (dt.length > 0) {\r\n if (!Array.isArray(dv)) {\r\n return this._changeValue2Type(dv, dt[0]);\r\n }\r\n\r\n for (let i=0; i<dt.length; i++) {\r\n dv[i] = this._changeValue2Type(dv[i], dt[i]);\r\n }\r\n }\r\n }\r\n return dv;\r\n }\r\n protected _changeValue2Type(v: V | undefined, t: unknown): V | undefined {\r\n void t;\r\n return v; //由实现了 dataType 的子类去实现\r\n }\r\n protected _writeDataSource() {\r\n const ds = this.dataSource;\r\n if (ds) {\r\n ds.offDataEvent(this);\r\n ds.setValue(this.dataValue);\r\n ds.onDataEvent(this);\r\n }\r\n }\r\n /**\r\n * form 的值与 #dv 同步\r\n * @param dv \r\n * @returns \r\n */\r\n protected _setFormValue() {\r\n const name = this.name;\r\n if (!name) return;\r\n\r\n const om = new ObjMember(name);\r\n const fd = new FormData();\r\n const dv = this.dataValue; \r\n if (!dv && dv !== 0 && dv !== 0n) {\r\n om.forEach(m => fd.set(m, ''));\r\n }\r\n else if (Array.isArray(dv)) {\r\n if (om.length === 1) {\r\n fd.set(name, JSON.stringify(dv));\r\n }\r\n else if (om.length >= dv.length) {\r\n om.forEach((m, i) => {\r\n const v = dv[i];\r\n if (!v && v !== 0 && v !== 0n) {\r\n fd.set(m, '');\r\n }\r\n else if (Array.isArray(v)) {\r\n fd.set(m, JSON.stringify(v));\r\n }\r\n else {\r\n fd.set(m, v);\r\n }\r\n });\r\n }\r\n else {\r\n throw new Error('InputBase._setFormValue 的 dataValue 数组长度小于字段数量!');\r\n }\r\n }\r\n else {\r\n //把 name 当作单个字段处理\r\n fd.set(name, JSON.stringify(dv));\r\n }\r\n\r\n this.ei.setFormValue(fd);\r\n }\r\n\r\n /**\r\n * $ipt 的值与 #dv 同步。这主要针对 $ipt.hidden = true 的组件,如 CheckList, SearchList。\r\n * 这些组件的 $ipt 只是用来满足表单验证需求的,并不直接显示数据。而且也只能满足 required 验证需求。\r\n * 所以这里设置 $ipt 的值不必太复杂。\r\n */\r\n protected _setIptValue($ipt = this.$ipt) {\r\n if (!$ipt.hidden) {\r\n return;\r\n }\r\n $ipt.value = getHiddenValueFromDataValue(this.dataValue);\r\n this._setValidity($ipt);\r\n }\r\n //#endregion\r\n\r\n //#region 数据源\r\n get dataSource() {\r\n return this.#ds;\r\n }\r\n set dataSource(ds) {\r\n if (this.#ds) {\r\n this.#ds.offDataEvent(this);\r\n this.#ds = void 0;\r\n }\r\n this.#ds = ds;\r\n this.#ds?.onDataEvent(this);\r\n this._getValueFromDataSource();\r\n }\r\n #ds?: InputDataSource<object>;\r\n\r\n _getValueFromDataSource() {\r\n const ds = this.dataSource;\r\n this.#dv = ds?.data ? ds.valueMember.getObjValue(ds.data).value as V : void 0;\r\n this._setFormValue(); //form 的值与 #dv 同步\r\n this._setIptValue(); //$ipt 的值与 #dv 同步\r\n this._showValue();\r\n }\r\n\r\n public [handleModelEvent](source: unknown, evt: ModelEvent): boolean {\r\n const ds = this.dataSource;\r\n if (ds && source === ds.data) {\r\n if (evt.type === 'item-update' && (evt as ModelItemUpdateEvent<object>).isPropertyChanged(...ds.valueMember.member)) {\r\n this._getValueFromDataSource();\r\n return true;\r\n }\r\n return false;\r\n }\r\n return super[handleModelEvent](source, evt);\r\n }\r\n //#endregion\r\n\r\n //#region ListSource\r\n get listSource() {\r\n return this.#ls;\r\n }\r\n set listSource(ls) {\r\n this.#ls = ls;\r\n this._showValue();\r\n }\r\n #ls?: ListSource<object>;\r\n\r\n protected _setActiveItem(...activeItems: object[]) {\r\n const ls = this.listSource;\r\n if (!ls) return;\r\n\r\n const ds = this.dataSource;\r\n\r\n //vm 重要的是其 length 属性,字段名称在调用 setListItems 时不重要。这样确保 dataValue 被赋值!\r\n const vm = ds ? ds.valueMember : ls.valueMember;\r\n const v = ls.setListItems(activeItems, vm).value as V;\r\n this.dataValue = v;\r\n }\r\n //#endregion\r\n\r\n //#region list\r\n /**\r\n * 对于有 list 属性的组件,需要生成一个 <datalist>\r\n * <datalist> 的弹出由浏览器自己控制,所以需要有一个 bind 的过程。\r\n * 对于 input-combo,list 弹出由代码控制,所以就无需重写 _bindList()。\r\n */\r\n protected _bindList($ipt = this.$ipt) {\r\n let $dl = $ipt.parentNode!.querySelector('DATALIST');\r\n $dl?.remove();\r\n\r\n const ls = Reflect.get(this, 'list');\r\n if (!ls || !Array.isArray(ls) || !ls.length) {\r\n $ipt.removeAttribute('list');\r\n return;\r\n }\r\n \r\n $dl = document.createElement('DATALIST');\r\n $dl.id = `datalist-${generateId()}`;\r\n $ipt.after($dl);\r\n $ipt.setAttribute('list', $dl.id);\r\n this._createListItems($dl, ls);\r\n }\r\n protected _createListItems($dl: Element, ls: string[]) {\r\n const $options = ls.map(x => {\r\n const $option = document.createElement('option');\r\n $option.value = x;\r\n return $option;\r\n })\r\n $dl.append(...$options);\r\n }\r\n //#endregion\r\n\r\n //#region 方法\r\n focus() {\r\n this.$ipt.focus();\r\n }\r\n //#endregion\r\n\r\n //#region 验证\r\n #monitorValidity($ipt = this.$ipt) {\r\n if (!$ipt.hidden && $ipt.type !== 'hidden') {\r\n $ipt.onchange ??= this.#onUserInput;\r\n $ipt.oninput ??= this.#onUserInput;\r\n }\r\n }\r\n #onUserInput = () => {\r\n this._setValidity();\r\n };\r\n\r\n /**\r\n * 因为这个函数完全是基于 $ipt 的 validity 来设置 ei 的 validity,\r\n * 所以当 $ipt 的值变化时,必须调用此函数以确保 ei 的 validity 正确。\r\n * 1 - _showValue() 中调用此函数,以确保 ei 的 validity 正确。\r\n * 2 - 验证属性变化时(如 required, max, min 等),也需要调用此函数。\r\n * 3 - 在 oninput onchange 事件中也需要调用此函数。\r\n */\r\n protected async _setValidity($ipt = this.$ipt) {\r\n const ret = this.model?.checkValidity?.($ipt);\r\n if (ret instanceof Promise) {\r\n await ret;\r\n }\r\n\r\n /**\r\n * 第一个参数:虽然 $ipt.validity 与 setValidity() 的第一个参数类型不同,但是它们的属性是一致的。\r\n * 第三个参数:传入 $ipt,这样在 form 元素调用 reportValidity() 时,可以高亮显示 $ipt。\r\n */\r\n this.ei.setValidity($ipt.validity, $ipt.validationMessage, $ipt);\r\n\r\n if (this.showValidityMessage) {\r\n const $lbl = $ipt.closest('label');\r\n if ($ipt.validationMessage) {\r\n $lbl?.setAttribute('validation-message', $ipt.validationMessage);\r\n }\r\n else {\r\n $lbl?.removeAttribute('validation-message');\r\n }\r\n }\r\n }\r\n\r\n //#region 浏览器内置的验证属性,这些属性一旦改变就需要调用 _setValidity()\r\n protected _required_set() {\r\n this._setValidity();\r\n }\r\n protected _pattern_set() {\r\n this._setValidity();\r\n }\r\n protected _min_set() {\r\n this._setValidity();\r\n }\r\n protected _max_set() {\r\n this._setValidity();\r\n }\r\n protected _minLength_set() {\r\n this._setValidity();\r\n }\r\n protected _maxLength_set() {\r\n this._setValidity();\r\n }\r\n protected _step_set() {\r\n this._setValidity();\r\n }\r\n protected _type_set() {\r\n this._setValidity();\r\n }\r\n protected _show_validity_message() {\r\n this._setValidity();\r\n }\r\n //#endregion\r\n\r\n setCustomError(error: string) {\r\n const $ipt = this.$ipt;\r\n\r\n //https://devdocs.io/dom/htmlinputelement/setcustomvalidity\r\n $ipt.setCustomValidity(error); //error 不是空字符串时,设置完后 ipt.validity.customError = true\r\n $ipt.reportValidity();\r\n this._setValidity($ipt);\r\n }\r\n\r\n /**\r\n * 通过 setCustomError() 设置的错误,只能通过此函数才能去掉!\r\n * @returns \r\n */\r\n clearCustomError() {\r\n const $ipt = this.$ipt;\r\n if ($ipt.validity.customError) {\r\n $ipt.setCustomValidity(''); //不能用 null\r\n this._setValidity($ipt);\r\n }\r\n }\r\n //#endregion\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor name: string | undefined;\r\n\r\n @boolAttr\r\n accessor required: boolean = false;\r\n\r\n @boolAttr\r\n accessor showValidityMessage: boolean = false;\r\n //#endregion\r\n}","import { strAttr, defineElement, type AttributeHandlers } from \"@gzmjs/ui-basic\";\r\nimport { ObjValue } from \"@gzmjs/mvvm\";\r\nimport { InputBase, type InputOptions, type LabelTextAlign, textAlign } from \"./01-input\";\r\n\r\nexport const tagName = 'GZM-INPUT-LABEL';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: InputLabel;\r\n }\r\n}\r\n\r\nexport interface InputLabelOptions extends InputOptions<unknown, InputLabel> {\r\n tagName?: typeof tagName;\r\n trueText?: string;\r\n falseText?: string;\r\n /**\r\n * 当 listSource.multiple = true 时,显示选中多项用此符号隔开。\r\n */\r\n multipleDelimiter?: string;\r\n}\r\n\r\nconst mutableAttributes = ['name', 'text-align', 'true-text', 'false-text'] as const;\r\nconst copyAttributes = {\r\n name: '$ipt'\r\n};\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class InputLabel extends InputBase<unknown, InputLabelOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n\r\n /**\r\n * 不开启 shadowRoot,因为其本质上是在 innerHTML 中显示内容\r\n * 本来打算在这里放一个 <output> 元素,但阅读了文档后又觉得没有必要:https://devdocs.io/html/element/output。\r\n */\r\n _createInput(): HTMLInputElement {\r\n //因为每一个 Input 都有,所以这里也装模做样地生成一个,其实没什么用。\r\n //另外:<label for> 指向这个 hidden,edge 也会警告。\r\n const $ipt = document.createElement('input');\r\n $ipt.setAttribute('type', 'hidden');\r\n return $ipt;\r\n }\r\n _showValue() {\r\n const dv = this.listSource?.getListDisplay(this.dsValue).toString(this) || this.dataValue;\r\n this.innerHTML = new ObjValue(dv).toString(this) || ' ';\r\n }\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor textAlign: LabelTextAlign = textAlign[0];\r\n\r\n _text_align_set(nv: string | null) {\r\n this.style.textAlign = nv ?? '';\r\n }\r\n\r\n @strAttr\r\n accessor trueText: string | undefined;\r\n\r\n _true_text_set() {\r\n this._showValue();\r\n }\r\n\r\n @strAttr\r\n accessor falseText: string | undefined;\r\n\r\n _false_text_set() {\r\n this._showValue();\r\n }\r\n\r\n @strAttr\r\n accessor multipleDelimiter: string = ' | '; //用 <br> 的话,需要 display:block;\r\n //#endregion\r\n}\r\n","import { saAttr, strAttr, defineElement, type AttributeHandlers, baseStyle } from \"@gzmjs/ui-basic\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { inputAutoComplete, iptStyle, removeZWC, type InputAutoComplete } from \"./00-common\";\r\n\r\nexport const tagName = 'GZM-INPUT-TEXT';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: TextInput;\r\n }\r\n}\r\n\r\nconst textType = ['text', 'password', 'email', 'tel', 'url', 'search'] as const;\r\ntype InputTextType = typeof textType[number];\r\n\r\nexport interface InputTextOptions extends InputOptions<string, TextInput> {\r\n tagName?: typeof tagName;\r\n\r\n type?: InputTextType;\r\n\r\n autocomplete?: InputAutoComplete;\r\n\r\n maxlength?: string;\r\n minlength?: string;\r\n\r\n /**\r\n * email,url 有默认的 pattern,无需代码处理。\r\n */\r\n pattern?: string;\r\n placeholder?: string;\r\n\r\n /**\r\n * HTMLElement 本身有此属性,所以只需要定义 mutableAttributes 和 copyAttributes,保证能够复制到 $ipt。\r\n */\r\n spellcheck?: boolean;\r\n\r\n list?: string[];\r\n}\r\n\r\nconst mutableAttributes = ['name', 'spellcheck', 'type', 'autocomplete', 'maxlength', 'minlength', 'pattern', 'placeholder', 'required', 'list'] as const;\r\nconst copyAttributes = Object.assign({\r\n type: '$ipt',\r\n autocomplete: '$ipt',\r\n maxlength: '$ipt',\r\n minlength: '$ipt',\r\n pattern: '$ipt',\r\n placeholder: '$ipt',\r\n spellcheck: '$ipt',\r\n}, inputCopyAttributes);\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class TextInput extends InputBase<string, InputTextOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n\r\n _createInput() {\r\n const $ipt = document.createElement('input');\r\n $ipt.className = 'ipt';\r\n $ipt.type = textType[0];\r\n $ipt.onchange = () => {\r\n let val = $ipt.value;\r\n if (val) val = removeZWC(val); //todo: 这里应该判断当前的语言,对于本身需要零宽字符的语言不要去掉。\r\n this.dataValue = val;\r\n\r\n this._setValidity($ipt);\r\n };\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($ipt);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, iptStyle];\r\n sr.append($lbl);\r\n \r\n return $ipt;\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare $ipt: HTMLInputElement;\r\n\r\n protected _showValue($ipt = this.$ipt) {\r\n $ipt.value = this.dsValue.toString();\r\n this._setValidity($ipt);\r\n }\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor type: InputTextType = textType[0];\r\n\r\n @strAttr\r\n accessor autoComplete: InputAutoComplete = inputAutoComplete[0];\r\n\r\n @strAttr\r\n accessor maxlength: string | undefined;\r\n\r\n @strAttr\r\n accessor minlength: string | undefined;\r\n\r\n @strAttr\r\n accessor pattern: string | undefined;\r\n\r\n @strAttr\r\n accessor placeholder: string | undefined;\r\n\r\n @saAttr\r\n accessor list: string[] | undefined;\r\n\r\n _list_set() {\r\n this._bindList();\r\n }\r\n //#endregion\r\n}","import { saAttr, strAttr, defineElement, type AttributeHandlers, baseStyle } from \"@gzmjs/ui-basic\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { inputAutoComplete, toDateStr, toTimeStr, toWeekStr, toMonthStr, type InputAutoComplete, iptStyle } from \"./00-common\";\r\n\r\nexport const tagName = 'GZM-INPUT-CAL';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: CalInput;\r\n }\r\n}\r\nconst calType = ['date', 'time', 'datetime-local', 'month', 'week'] as const;\r\ntype InputCalType = typeof calType[number];\r\n\r\n/**\r\n * 根据 /try/html/input-date.html 的测试,并不是每一种 calType 支持 valueAsDate 和 valueAsNumber。\r\n * 而且不同浏览器的情况还不一样!不过对于 value 的支持是肯定的,所以一定要以 value 即字符串值作为基础。\r\n */\r\nconst calDataType = ['string', 'date', 'number'] as const;\r\ntype InputCalDataType = typeof calDataType[number];\r\n\r\ntype CalDataType = string | number | Date;\r\n\r\nexport interface InputCalOptions extends InputOptions<CalDataType, CalInput> {\r\n tagName?: typeof tagName;\r\n\r\n type?: InputCalType;\r\n dataType?: InputCalDataType;\r\n\r\n autocomplete?: InputAutoComplete;\r\n max?: string;\r\n min?: string;\r\n step?: string;\r\n\r\n list?: string[];\r\n}\r\n\r\nconst mutableAttributes = ['name', 'type', 'autocomplete', 'max', 'min', 'step', 'required', 'list'] as const;\r\nconst copyAttributes = Object.assign({\r\n type: '$ipt',\r\n autocomplete: '$ipt',\r\n max: '$ipt',\r\n min: '$ipt',\r\n step: '$ipt',\r\n}, inputCopyAttributes);\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class CalInput extends InputBase<CalDataType, InputCalOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n\r\n _createInput() {\r\n const $ipt = document.createElement('input');\r\n $ipt.className = 'ipt';\r\n $ipt.type = calType[0];\r\n $ipt.onchange = () => {\r\n this.dataValue = $ipt.value || void 0;\r\n this._setValidity($ipt);\r\n };\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($ipt);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, iptStyle];\r\n sr.append($lbl);\r\n\r\n return $ipt;\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare $ipt: HTMLInputElement;\r\n\r\n /**\r\n * number -> Date -> string\r\n * 为了提高可用性,这里没有判断 dataType,而是根据实际的数据类型来处理。\r\n */\r\n protected _showValue($ipt = this.$ipt) {\r\n let dv = this.dataValue;\r\n if (!dv && dv !== 0) {\r\n $ipt.value = '';\r\n this._setValidity($ipt);\r\n return;\r\n }\r\n if (typeof dv === 'string') {\r\n //$ipt 会判断字符串的合法性,且 星期 和 时间 字符串无法用 Date.parse() 来解析。\r\n $ipt.value = dv;\r\n this._setValidity($ipt);\r\n return;\r\n }\r\n if (typeof dv === 'number') {\r\n if (Number.isNaN(dv)) {\r\n $ipt.value = '';\r\n this._setValidity($ipt);\r\n return;\r\n }\r\n dv = new Date(dv);\r\n }\r\n if (!(dv instanceof Date)) {\r\n $ipt.value = '';\r\n this._setValidity($ipt);\r\n return;\r\n }\r\n //执行到这里 dv 只能是 Date\r\n $ipt.value = date2str(dv, this.type);\r\n this._setValidity($ipt);\r\n }\r\n\r\n /**\r\n * 对于这个 input 而言,值就是一个字符串。当 t === string,无需进行任何转换。\r\n * 所以只需要处理 date 或者 number, string -> Date -> number。\r\n */\r\n _changeValue2Type(v: unknown, t: InputCalDataType): CalDataType | undefined {\r\n if (!v && v !== 0) {\r\n return void 0;\r\n }\r\n\r\n if (typeof v === 'string') {\r\n const d = str2date(v, this.type);\r\n return this.#changeType(d, t);\r\n }\r\n\r\n //执行到这里 v 不可能是一个字符串\r\n\r\n if (typeof v === 'number') {\r\n const d = Number.isNaN(v) ? void 0 : new Date(v);\r\n return this.#changeType(d, t);\r\n }\r\n\r\n if (v instanceof Date) {\r\n const d = Number.isNaN(v.getTime()) ? void 0 : v;\r\n return this.#changeType(d, t);\r\n }\r\n \r\n return void 0;\r\n }\r\n #changeType(d: Date | undefined, t: InputCalDataType) {\r\n if (!d) {\r\n return void 0;\r\n }\r\n else if (t === 'number') {\r\n return d.valueOf();\r\n }\r\n else if (t === 'string') {\r\n return date2str(d, this.type);//可能 v 是合法的日期,但却不是 this.type 要求的,所以不能直接返回 v。\r\n }\r\n else {\r\n return d;\r\n }\r\n }\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor type: InputCalType = calType[0];\r\n\r\n @strAttr\r\n accessor dataType: InputCalDataType = calDataType[0];\r\n\r\n @strAttr\r\n accessor autocomplete: InputAutoComplete = inputAutoComplete[0];\r\n\r\n @strAttr\r\n accessor max: string | undefined;\r\n\r\n @strAttr\r\n accessor min: string | undefined;\r\n\r\n @strAttr\r\n accessor Step: string | undefined;\r\n\r\n @saAttr\r\n accessor list: string[] | undefined;\r\n\r\n _list_set() {\r\n this._bindList();\r\n }\r\n //#endregion\r\n}\r\n\r\nfunction date2str(d: Date, type: InputCalType) {\r\n switch(type) {\r\n case 'date':\r\n return toDateStr(d);\r\n case 'time':\r\n return toTimeStr(d);\r\n case 'datetime-local':\r\n return `${toDateStr(d)}T${toTimeStr(d)}`;\r\n case 'month':\r\n return toMonthStr(d);\r\n case 'week':\r\n return toWeekStr(d);\r\n }\r\n}\r\nfunction str2date(s: string, type: InputCalType) : Date | undefined {\r\n switch (type) {\r\n case 'datetime-local':\r\n {\r\n const n = Date.parse(s);\r\n return Number.isNaN(n) ? void 0 : new Date(n);\r\n }\r\n case 'date':\r\n {\r\n s = s + 'T00:00'; //不加上时间部分,Date.parse() 会添加时差8小时\r\n const n = Date.parse(s);\r\n return Number.isNaN(n) ? void 0 : new Date(n);\r\n }\r\n case 'time':\r\n {\r\n s = '1970-01-01T' + s;\r\n const n = Date.parse(s);\r\n return Number.isNaN(n) ? void 0 : new Date(n);\r\n }\r\n case 'month':\r\n {\r\n s = s + '-01T00:00'; //该月的1号\r\n const n = Date.parse(s);\r\n return Number.isNaN(n) ? void 0 : new Date(n);\r\n }\r\n case 'week':\r\n {\r\n //该周的第一天\r\n const ret = parseWeekString(s);\r\n if (!ret) {\r\n return void 0;\r\n }\r\n return getFirstDayOfWeekX(ret.year, ret.week);\r\n }\r\n }\r\n}\r\n\r\nfunction parseWeekString(weekString: string) {\r\n const year = weekString.slice(0, 4);\r\n const week = weekString.slice(6);\r\n\r\n const y = Number.parseInt(year);\r\n const w = Number.parseInt(week);\r\n if (Number.isNaN(y) || Number.isNaN(w)) {\r\n return void 0;\r\n }\r\n \r\n return { year: y, week: w };\r\n}\r\nfunction getFirstDayOfWeekX(year: number, weekNumber: number) {\r\n // 计算一年中第一个星期的第一天\r\n const date = new Date(year, 0, 1);\r\n const day = date.getDay();\r\n const diff = (day <= 4) ? 1 - day : 8 - day;\r\n date.setDate(1 + diff);\r\n \r\n // 计算第 X 周的第一天\r\n const daysToAdd = (weekNumber - 1) * 7;\r\n date.setDate(date.getDate() + daysToAdd);\r\n \r\n if (Number.isNaN(date.getTime())) {\r\n return void 0;\r\n }\r\n return date;\r\n}\r\n","import { strAttr, defineElement, type AttributeHandlers, baseStyle, createStyleSheet } from \"@gzmjs/ui-basic\";\r\nimport { InputBase, type InputOptions } from \"./01-input\";\r\n\r\nexport const tagName = 'GZM-INPUT-CHECK';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: CheckInput;\r\n }\r\n}\r\n\r\nconst styleSheet = createStyleSheet({\r\n ':host': `\r\n display: inline-flex;\r\n vertical-align: middle;\r\n justify-content: space-around;\r\n `,\r\n ':host::before': `\r\n content: attr(false-text);\r\n opacity: 0.75;\r\n `,\r\n ':host::after': `\r\n content: attr(true-text);\r\n opacity: 0.75;\r\n `,\r\n ':host:has(> input:not(:checked))::before': `\r\n font-weight: bolder;\r\n opacity: 1;\r\n `,\r\n ':host:has(> input:checked)::after': `\r\n font-weight: bolder;\r\n opacity: 1;\r\n `,\r\n '.switch': `\r\n /* width: 2.5em; 同时会改变高度,导致滑槽无法覆盖,所以改为使用 margin-inline */\r\n margin-inline: 1em; /*至少要与滑块的宽度相同。*/\r\n position: relative;\r\n `,\r\n '.switch::before': /*滑槽,且遮挡方框*/ `\r\n content: \"\";\r\n position: absolute;\r\n background-color: var(--gzm-switch-background);\r\n\r\n width: 2.5em;\r\n height: 1.5em;/*算下来正好24px,没有小数。且与方框高度相同。*/\r\n border-radius: 0.75em;\r\n\r\n top: 50%; /*与下面 -50% 结合,使其垂直居中*/\r\n left: 50%; /*与下面 -50% 结合,使其水平居中*/\r\n transform: translate(-50%, -50%);\r\n `,\r\n '.switch::after': /*滑块,在滑槽之上(z-index)*/ `\r\n content: \"\";\r\n position: absolute;\r\n\r\n /*因为 0.6 透明度,白色混合 before 的灰色*/\r\n background: #fff;\r\n opacity: 0.6;\r\n\r\n width: 1em;\r\n height: 1em;\r\n border-radius: 1em;\r\n\r\n top: 50%; /*与下面 -50% 结合,使其垂直居中*/\r\n left: 50%;\r\n transform: translate(-0.8em, -50%);\r\n transition: all .4s;\r\n `,\r\n '.switch:checked::before': `\r\n background-color: var(--gzm-switch-check-background);\r\n `,\r\n '.switch:checked::after': `\r\n opacity: 1;\r\n transform: translate(-0.2em, -50%);\r\n `,\r\n});\r\n\r\nconst checkDataType = ['boolean', 'string', 'number'] as const;\r\ntype InputCheckDataType = typeof checkDataType[number];\r\ntype CheckDataType = boolean | string | number;\r\n\r\nexport interface InputCheckOptions extends InputOptions<CheckDataType, CheckInput> {\r\n tagName?: typeof tagName;\r\n\r\n dataType?: InputCheckDataType;\r\n trueText?: string;\r\n falseText?: string;\r\n}\r\n\r\nconst mutableAttributes = ['name', /*'required'*/] as const;//浏览器认为:只有勾选了才满足 required;所以不适用于单个 checkbox。\r\nconst copyAttributes = {\r\n name: '$ipt'\r\n};\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class CheckInput extends InputBase<CheckDataType, InputCheckOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n\r\n _createInput() {\r\n const $ipt = document.createElement('input');\r\n $ipt.type = 'checkbox';\r\n $ipt.className = 'switch';//只要注释这一行代码,无需修改其他,就会回归原生的样式。\r\n $ipt.onchange = () => {\r\n this.dataValue = $ipt.checked;\r\n this._setValidity($ipt);\r\n };\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, styleSheet];\r\n sr.append($ipt);\r\n\r\n return $ipt;\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare $ipt: HTMLInputElement;\r\n\r\n protected _showValue($ipt = this.$ipt) {\r\n let dv = this.dataValue;\r\n\r\n if (typeof dv === 'string') {\r\n dv = (dv === '0' ? false: true);\r\n }\r\n dv = !!dv;\r\n $ipt.checked = dv;\r\n this._setValidity($ipt);\r\n }\r\n _changeValue2Type(v: unknown, t: InputCheckDataType): CheckDataType | undefined {\r\n let b = false;\r\n\r\n if (v) {\r\n if (typeof v === 'string') {\r\n if (v === '1') {\r\n b = true;\r\n }\r\n }\r\n else {\r\n b = true;\r\n }\r\n }\r\n\r\n switch (t) {\r\n case 'boolean':\r\n return b;\r\n case 'string':\r\n return b ? '1' : '0';\r\n case 'number':\r\n return b ? 1 : 0;\r\n }\r\n }\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor dataType: InputCheckDataType = checkDataType[0];\r\n\r\n @strAttr\r\n accessor trueText: string | undefined;\r\n\r\n @strAttr\r\n accessor falseText: string | undefined;\r\n //#endregion\r\n}\r\n","import { strAttr, defineElement, type AttributeHandlers, baseStyle, saAttr } from \"@gzmjs/ui-basic\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { inputAutoComplete, iptStyle, type InputAutoComplete } from \"./00-common\";\r\n\r\nexport const tagName = 'GZM-INPUT-NUM';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: NumInput;\r\n }\r\n}\r\n\r\nconst numDataType = ['number', 'int', 'currency'] as const;\r\ntype InputNumDataType = typeof numDataType[number];\r\n\r\nexport interface InputNumOptions extends InputOptions<number, NumInput> {\r\n tagName?: typeof tagName;\r\n\r\n dataType?: InputNumDataType;\r\n autocomplete?: InputAutoComplete;\r\n max?: string;\r\n min?: string;\r\n step?: string;\r\n placeholder?: string;\r\n\r\n list?: string[];\r\n}\r\n\r\nconst mutableAttributes = ['name', 'data-type', 'autocomplete', 'max', 'min', 'step', 'placeholder', 'list', 'required'] as const;\r\nconst copyAttributes = Object.assign({\r\n autocomplete: '$ipt',\r\n max: '$ipt',\r\n min: '$ipt',\r\n step: '$ipt',\r\n placeholder: '$ipt',\r\n}, inputCopyAttributes);\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class NumInput extends InputBase<number, InputNumOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n\r\n _createInput() {\r\n const $ipt = document.createElement('input');\r\n $ipt.className = 'ipt';\r\n $ipt.type = 'number';\r\n $ipt.step = 'any'; //因为默认的 dataType 是 number,需要允许小数。\r\n $ipt.onchange = () => {\r\n const v = $ipt.valueAsNumber;\r\n //console.debug(v);\r\n this.dataValue = v;\r\n this._setValidity($ipt);\r\n };\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($ipt);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, iptStyle];\r\n sr.append($lbl);\r\n\r\n return $ipt;\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare $ipt: HTMLInputElement;\r\n\r\n protected _showValue($ipt = this.$ipt) {\r\n const dv = this.dataValue;\r\n if (!dv) {\r\n if (dv === 0) {\r\n $ipt.valueAsNumber = 0;\r\n }\r\n else {\r\n $ipt.value = '';\r\n }\r\n }\r\n else {\r\n $ipt.valueAsNumber = Number(dv);\r\n }\r\n this._setValidity($ipt);\r\n }\r\n _changeValue2Type(v: unknown, t: InputNumDataType): number | undefined {\r\n if (!v && v !== 0) {\r\n return void 0;\r\n }\r\n let n: number;\r\n switch (t) {\r\n case 'number':\r\n {\r\n n = Number(v);\r\n break;\r\n }\r\n case 'int':\r\n {\r\n if (Number.isInteger(v)) {\r\n n = v as number;\r\n }\r\n else {\r\n n = Math.round(Number(v)); //去掉小数点\r\n }\r\n break;\r\n }\r\n case 'currency':\r\n {\r\n n = Math.round(Number(v) * 100) / 100; //保留2位小数\r\n break;\r\n }\r\n }\r\n\r\n return Number.isNaN(n) ? void 0 : n;\r\n }\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor dataType: InputNumDataType = numDataType[0];\r\n\r\n @strAttr\r\n accessor autoComplete: InputAutoComplete = inputAutoComplete[0];\r\n\r\n @strAttr\r\n accessor max: string | undefined;\r\n\r\n @strAttr\r\n accessor min: string | undefined;\r\n\r\n @strAttr\r\n accessor step: string | undefined;\r\n\r\n @strAttr\r\n accessor placeholder: string | undefined;\r\n\r\n @saAttr\r\n accessor list: string[] | undefined;\r\n\r\n _list_set() {\r\n this._bindList();\r\n }\r\n\r\n _data_type_set() {\r\n let step = this.step;\r\n if (!step) {\r\n switch(this.dataType) {\r\n case 'int':\r\n step = '1';\r\n break;\r\n case 'currency':\r\n step = '0.01';\r\n break;\r\n case 'number':\r\n default:\r\n step = 'any';\r\n break;\r\n }\r\n\r\n const $ipt = this.$ipt;\r\n $ipt.step = step;\r\n this._setValidity($ipt);\r\n }\r\n }\r\n //#endregion\r\n}\r\n","import { strAttr, defineElement, type AttributeHandlers, baseStyle, saAttr, GT, createStyleSheet } from \"@gzmjs/ui-basic\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { inputAutoComplete, iptStyle, getInputIdForLabel, type InputAutoComplete } from \"./00-common\";\r\n\r\nexport const tagName = 'GZM-INPUT-COLOR';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: ColorInput;\r\n }\r\n}\r\n\r\nconst styleSheet = createStyleSheet({\r\n 'div': `\r\n position: relative;\r\n display: inline-flex;\r\n `,\r\n 'div > label': `\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n top: 50%;\r\n transform: translate(0, -50%);\r\n background: transparent;\r\n text-align: center;\r\n `,\r\n});\r\n\r\nconst colorDataType = ['string', 'int'] as const;\r\ntype InputColorDataType = typeof colorDataType[number];\r\ntype ColorDataType = string | number;\r\n\r\nexport interface InputColorOptions extends InputOptions<ColorDataType, ColorInput> {\r\n tagName?: typeof tagName;\r\n\r\n dataType?: InputColorDataType;\r\n autocomplete?: InputAutoComplete;\r\n\r\n list?: string[];\r\n}\r\nconst mutableAttributes = ['name', 'autocomplete', 'list', 'required'] as const;\r\nconst copyAttributes = Object.assign({\r\n autocomplete: '$ipt',\r\n}, inputCopyAttributes);\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class ColorInput extends InputBase<ColorDataType, InputColorOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n \r\n constructor() {\r\n super();\r\n const $ipt = this.$ipt;\r\n if (usePicker($ipt)) {\r\n this.$lbl = createLabel($ipt);\r\n }\r\n }\r\n\r\n _createInput() {\r\n const $ipt = document.createElement('input');\r\n $ipt.className = 'ipt';\r\n $ipt.type = 'color';\r\n \r\n //用来给 this.$lbl 定位。注意 this.$lbl 不是下面的 $lbl。\r\n const $div = document.createElement('div');\r\n $div.append($ipt);\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($div);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, iptStyle, styleSheet];\r\n sr.append($lbl);\r\n\r\n /* 在弹出上点击颜色的时候就会触发 input,所以不要 change 了\r\n ipt.addEventListener('change', e => {\r\n const v = e.target.value;\r\n //console.debug(v);\r\n this.dataValue = v;\r\n });*/\r\n $ipt.oninput = () => {\r\n this.#showValueOnLabel();\r\n this.dataValue = $ipt.value;\r\n if (this.required) {\r\n $ipt.setCustomValidity('');\r\n }\r\n this._setValidity($ipt);\r\n };\r\n return $ipt;\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare $ipt: HTMLInputElement;\r\n private $lbl?: HTMLLabelElement;\r\n\r\n protected _showValue($ipt = this.$ipt) {\r\n let dv = this.dataValue;\r\n if (typeof dv === 'number') {\r\n dv = num2color(dv);\r\n }\r\n $ipt.value = (dv as string) || '#000000'; //原本默认值就是黑色\r\n this.#showValueOnLabel($ipt);\r\n\r\n if (this.required && !dv) { //-1 = white, -16777216 = 黑色\r\n $ipt.setCustomValidity(GT.valueMissing);\r\n }\r\n this._setValidity($ipt);\r\n }\r\n #showValueOnLabel($ipt = this.$ipt) {\r\n const $lbl = this.$lbl;\r\n if (!$lbl) return;\r\n\r\n const v = $ipt.value;\r\n $lbl.textContent = v;\r\n\r\n //lbl 的颜色必须和当前颜色相反才看得清楚\r\n const i = color2num(v);\r\n const u = toUnsigned(i);\r\n const c = num2color(~u);\r\n $lbl.style.color = c;\r\n }\r\n\r\n _changeValue2Type(v: unknown, t: InputColorDataType): ColorDataType | undefined {\r\n const vt = typeof v;\r\n if (vt !== 'string' && vt !== 'number') {\r\n return void 0;\r\n }\r\n\r\n if (t === 'int') {\r\n if (vt === 'number') {\r\n return v as number;\r\n }\r\n return color2num(v as string);\r\n }\r\n else if (t === 'string') {\r\n if (vt === 'string') {\r\n return v as string;\r\n }\r\n return num2color(v as number);\r\n }\r\n }\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor dataType: InputColorDataType = colorDataType[0];\r\n\r\n @strAttr\r\n accessor autocomplete: InputAutoComplete = inputAutoComplete[0];\r\n\r\n @saAttr\r\n accessor list: string[] | undefined;\r\n\r\n _list_set() {\r\n this._bindList();\r\n }\r\n //#endregion\r\n}\r\n\r\nfunction toUnsigned(num: number) {\r\n //不是转换为无符号整数\r\n //dotnet CAF.ToArgb() 获得的4个字节(整数)中,第一个字节代表Alpha,总是FF\r\n //这里其实是去掉Alpha部分,保留剩下的RGB\r\n num = num & 0xFFFFFF;\r\n return num;\r\n}\r\nfunction toSigned(num: number) {\r\n //转换为有符号整数\r\n num = ~num;\r\n num = num + 1;\r\n num = -num;\r\n return num;\r\n}\r\nfunction color2num(colorStr: string) {\r\n colorStr = colorStr.substr(1); //取掉#\r\n let tmp = '';\r\n for (let i = 0; i < 6 - colorStr.length; i++) {\r\n tmp += '0';\r\n }\r\n colorStr = tmp + colorStr;\r\n colorStr = 'FF' + colorStr; //dotNet Color是一个整数,第一个字节是Alpha值,永远是FF\r\n const c = parseInt(colorStr, 16);\r\n return toSigned(c);\r\n}\r\nfunction num2color(num: number) {\r\n num = toUnsigned(num);\r\n let color = num.toString(16).toUpperCase();\r\n\r\n //应该是8位,前2位是Alpha值,不予考虑\r\n if (color.length <= 6) {\r\n let tmp = '';\r\n for (let i = 0; i < 6 - color.length; i++) {\r\n tmp += '0';\r\n }\r\n color = '#' + tmp + color;\r\n }\r\n else {\r\n color = '#' + color.substr(color.length - 6);\r\n }\r\n return color;\r\n}\r\n\r\n /**\r\n * chrome 中实现 color 使用 picker,但是根据文档 https://devdocs.io/html/element/input/color\r\n * 并不是所有的浏览器都如此,有的是作为 text 来实现的。\r\n * 对于 chrome 这样的实现,需要一个 label 来显示值。\r\n */\r\nfunction usePicker($ipt: HTMLInputElement) {\r\n let isPicker = true;\r\n const sh = () => {\r\n isPicker = false;\r\n };\r\n $ipt.onselect = sh;\r\n $ipt.select();\r\n $ipt.onselect = null;\r\n return isPicker;\r\n}\r\nfunction createLabel($ipt: HTMLInputElement) {\r\n const $lbl = document.createElement('label');\r\n $lbl.setAttribute('for', getInputIdForLabel($ipt));\r\n $ipt.after($lbl);\r\n return $lbl\r\n}\r\n","import { strAttr, defineElement, type AttributeHandlers, baseStyle, intAttr, boolAttr, createStyleSheet } from \"@gzmjs/ui-basic\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { iptStyle, removeZWC } from \"./00-common\";\r\n\r\nexport const tagName = 'GZM-INPUT-LINES';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: LinesInput;\r\n }\r\n}\r\n\r\nconst styleSheet = createStyleSheet({\r\n /*因为有 array-split,所以不能自动换行!每一行代表一项数据!*/\r\n 'textarea[data-type=array]': `\r\n white-space: pre;\r\n `,\r\n 'textarea[ignore-rows]': `\r\n height: 100%;\r\n `,\r\n});\r\n\r\nconst linesDataType = ['string', 'array'] as const;\r\ntype InputLinesDataType = typeof linesDataType[number];\r\ntype LinesDataType = string | string[];\r\n\r\nexport interface InputLinesOptions extends InputOptions<LinesDataType, LinesInput> {\r\n tagName?: typeof tagName;\r\n\r\n /**\r\n * array 类型适用于【标签】这种类型的数据。\r\n */\r\n dataType?: InputLinesDataType;\r\n\r\n /**\r\n * 忽略 rows 属性,ta高度由外层决定\r\n */\r\n ignoreRows?: boolean;\r\n\r\n /**\r\n * 未设置时,浏览器中 <textarea> 默认值是 2。\r\n * 如果设置了 input-lines 的高度,因为 :host display=flex 的原因,rows 不起作用。\r\n */\r\n rows?: number;\r\n\r\n /**\r\n * HTMLElement 本身有此属性,所以只需要定义 mutableAttributes 和 copyAttributes,保证能够复制到 $ipt。\r\n */\r\n spellcheck?: boolean;\r\n}\r\n\r\nconst mutableAttributes = ['name', 'spellcheck', 'rows', 'required', 'data-type', 'ignore-rows'] as const;\r\nconst copyAttributes = Object.assign({\r\n rows: '$ipt',\r\n spellcheck: '$ipt',\r\n\r\n //下面2个属性要复制为了样式能够起作用!\r\n 'data-type': '$ipt',\r\n 'ignore-rows': '$ipt',\r\n}, inputCopyAttributes);\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class LinesInput extends InputBase<LinesDataType, InputLinesOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n\r\n _createInput() {\r\n const $ipt = document.createElement('textarea');\r\n $ipt.className = 'ipt';\r\n $ipt.onchange = () => {\r\n let val = $ipt.value; //虽然 textarea 不支持 value attribute,但是 value 属性还是支持的!\r\n if (val) val = removeZWC(val);\r\n this.dataValue = val;\r\n this._setValidity($ipt);\r\n };\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($ipt);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, iptStyle, styleSheet];\r\n sr.append($lbl);\r\n\r\n return $ipt;\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare $ipt: HTMLTextAreaElement;\r\n\r\n protected _showValue($ipt = this.$ipt) {\r\n let dv = this.dataValue;\r\n if (Array.isArray(dv)) {\r\n dv = dv.join(arraySplit);\r\n }\r\n\r\n $ipt.value = dv ?? '';\r\n this._setValidity($ipt);\r\n\r\n //防止内容过多出现滚动栏后,光标停留在最后。\r\n $ipt.selectionStart = 0;\r\n $ipt.selectionEnd = 0;\r\n }\r\n _changeValue2Type(v: unknown, t: InputLinesDataType): LinesDataType | undefined {\r\n if (!v) {\r\n return void 0;\r\n }\r\n\r\n if (Array.isArray(v)) {\r\n if (t === 'array') {\r\n return v;\r\n }\r\n return v.join(arraySplit);\r\n }\r\n\r\n if (typeof v !== 'string') {\r\n v = String(v);\r\n }\r\n\r\n //执行到这里 v 只能是 string\r\n const s = v as string;\r\n if (t === 'string') {\r\n return s;\r\n }\r\n return s.split(arraySplit);\r\n };\r\n \r\n //#region 属性\r\n @strAttr\r\n accessor dataType: InputLinesDataType = linesDataType[0];\r\n\r\n @intAttr\r\n accessor rows: number | undefined;\r\n\r\n @boolAttr\r\n accessor ignoreRows: boolean = false;\r\n //#endregion\r\n}\r\n\r\nconst arraySplit = '\\n';","import { iconCache, defineElement, type AttributeHandlers, type Icon, boolAttr, iconTagName } from \"@gzmjs/ui-basic\";\r\nimport { ViewElement, type ViewModel } from \"@gzmjs/mvvm\";\r\nimport type { ComboList } from \"./25-comboList\";\r\n\r\nexport const tagName = 'GZM-COMBO-ITEM';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: ComboItem;\r\n }\r\n}\r\n\r\nexport interface ComboItemOptions extends ViewModel<ComboItem> {\r\n active?: boolean;\r\n\r\n data: object;\r\n values: string[];\r\n labels: string[];\r\n}\r\nconst mutableAttributes = ['active'] as const;\r\n\r\n@defineElement({tagName, mutableAttributes})\r\nexport class ComboItem extends ViewElement<ComboItemOptions> implements AttributeHandlers<typeof mutableAttributes[number]> {\r\n //#region 元素\r\n get $list(): ComboList {\r\n const sr = this.getRootNode() as ShadowRoot;\r\n return sr.host as unknown as ComboList;\r\n }\r\n get multiple(): boolean {\r\n return this.$list.model?.listSource.multiple ?? false;\r\n }\r\n\r\n /**\r\n * 无论是单选还是多选,都只在选中 active 状态下才显示勾\r\n * 注意:这个只是 icon 的容器,且只有这个用 div,其他显示文本的都用 span。\r\n */\r\n get $icon() {\r\n if (!this.#icon) {\r\n this.#icon = document.createElement(iconTagName);\r\n this.prepend(this.#icon);\r\n }\r\n return this.#icon;\r\n }\r\n #icon?: Icon;\r\n\r\n #values?: HTMLElement[];\r\n #labels?: HTMLElement[];\r\n //#endregion\r\n\r\n //#region 属性\r\n set values(v: string[]) {\r\n const $va = (this.#values ??= []);\r\n for (let i = 0; i < v.length; i++) {\r\n let $v = $va[i];\r\n if (!$v) {\r\n $v = $va[i] = document.createElement('span');\r\n if (i === 0) {\r\n this.$icon.after($v);\r\n }\r\n else {\r\n $va[i-1]!.after($v);\r\n }\r\n }\r\n $v.textContent = v[i] ?? '';\r\n }\r\n while ($va.length > v.length) {\r\n $va.pop()?.remove();\r\n }\r\n }\r\n\r\n set labels(v: string[]) {\r\n const $la = (this.#labels ??= []);\r\n for (let i = 0; i < v.length; i++) {\r\n let $l = $la[i];\r\n if (!$l) {\r\n $l = $la[i] = document.createElement('span');\r\n this.append($l);\r\n }\r\n $l.textContent = v[i] ?? '';\r\n }\r\n while ($la.length > v.length) {\r\n $la.pop()?.remove();\r\n }\r\n }\r\n\r\n\r\n @boolAttr\r\n accessor active: boolean = false;\r\n\r\n _active_set() {\r\n if (!this.active) {\r\n this.$icon.icon = void 0;\r\n return;\r\n }\r\n\r\n const name = this.multiple ? checkboxChecked : radioChecked;\r\n this.$icon.icon = name;\r\n }\r\n //#endregion\r\n}\r\n\r\nconst radioChecked = 'gzm-menu-item-radio-checked';\r\nconst checkboxChecked = 'gzm-menu-item-checkbox-checked';\r\n\r\niconCache[checkboxChecked] =\r\n`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n <path d=\"M18.333 2c1.96 0 3.56 1.537 3.662 3.472l.005 .195v12.666c0 1.96 -1.537 3.56 -3.472 3.662l-.195 .005h-12.666a3.667 3.667 0 0 1 -3.662 -3.472l-.005 -.195v-12.666c0 -1.96 1.537 -3.56 3.472 -3.662l.195 -.005h12.666zm-2.626 7.293a1 1 0 0 0 -1.414 0l-3.293 3.292l-1.293 -1.292l-.094 -.083a1 1 0 0 0 -1.32 1.497l2 2l.094 .083a1 1 0 0 0 1.32 -.083l4 -4l.083 -.094a1 1 0 0 0 -.083 -1.32z\" stroke-width=\"0\" fill=\"currentColor\"></path>\r\n</svg>`;\r\n\r\niconCache[radioChecked] =\r\n`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n <path d=\"M17 3.34a10 10 0 1 1 -14.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 14.995 -8.336zm-1.293 5.953a1 1 0 0 0 -1.32 -.083l-.094 .083l-3.293 3.292l-1.293 -1.292l-.094 -.083a1 1 0 0 0 -1.403 1.403l.083 .094l2 2l.094 .083a1 1 0 0 0 1.226 0l.094 -.083l4 -4l.083 -.094a1 1 0 0 0 -.083 -1.32z\" stroke-width=\"0\" fill=\"currentColor\"></path>\r\n</svg>`;","import { defineElement, createStyleSheet, baseStyle, strAttr } from \"@gzmjs/ui-basic\";\r\nimport { ViewListElement, type ViewListModel, type ListSource } from \"@gzmjs/mvvm\";\r\nimport { ComboItem, type ComboItemOptions, tagName as itemTagName } from \"./24-comboItem\";\r\n\r\nexport const tagName = 'GZM-COMBO-LIST';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: ComboList;\r\n }\r\n}\r\n\r\nconst styleSheet = createStyleSheet({\r\n ':host': `\r\n overflow: hidden;\r\n max-height: 50vh; /* 只是限定最大高度,无法使 section 显示滚动条*/\r\n display: flex; /*利用 flex 限定 section 的高度,溢出显示滚动栏*/\r\n flex-direction: column;\r\n `,\r\n ['section']: `\r\n display: grid;\r\n overflow: auto;\r\n flex: auto;\r\n `,\r\n //无论是动态过滤,还是一个 item 子元素都没有,要显示一些告知操作员。\r\n //firefox 对 :host 支持不好。如果写成 :host > section::after,则 firefox 不显示内容。\r\n 'section::after': `\r\n content: attr(empty-tip, \"---EMPTY---\");\r\n `,\r\n [`section:has(${itemTagName}:not([hidden]))::after`]: `\r\n content: \"\";\r\n display: none;\r\n `,\r\n\r\n //item\r\n [itemTagName]: `\r\n cursor: pointer;\r\n display: contents;\r\n `,\r\n [`${itemTagName}>*`]: `\r\n border:1px solid transparent;\r\n padding-inline: 0.5rem;\r\n `,\r\n\r\n [`${itemTagName}>*:not(:last-child)`]: `\r\n border-right:0;\r\n `,\r\n [`${itemTagName}>*:not(:first-child)`]: `\r\n border-left:0;\r\n `,\r\n [`${itemTagName}:active>*, ${itemTagName}[active]>*`]: {\r\n color: 'var(--gzm-a-btn-txt-color)',\r\n background: 'var(--gzm-a-btn-background)',\r\n border: 'var(--gzm-a-btn-border)',\r\n },\r\n [`${itemTagName}:hover>*`]: {\r\n background: 'var(--gzm-h-btn-background)',\r\n border: 'var(--gzm-h-btn-border)',\r\n color: 'var(--gzm-h-btn-txt-color)',\r\n },\r\n});\r\n\r\nexport interface ComboListOptions extends ViewListModel<ComboItemOptions, ComboItem, ComboList> {\r\n listSource: ListSource<object>;\r\n\r\n /**\r\n * 这个属性要求在 listSource 之后定义,需要先通过 listSource 初始化各个 ComboItem,然后才能设置 active 状态。\r\n */\r\n activeItems: Set<object>; //不会再次 proxy 化\r\n activeItemsChanged?: (activeItems: Set<object>) => void;\r\n\r\n emptyTip?: string;\r\n}\r\n\r\nconst mutableAttributes = ['empty-tip'];\r\nconst copyAttributes = {\r\n 'empty-tip': '$section'\r\n};\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class ComboList extends ViewListElement<ComboItemOptions, ComboItem, ComboListOptions> {\r\n constructor() {\r\n super();\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, styleSheet];\r\n sr.appendChild(this.$section);\r\n this.$section.onclick = this.#onclick;\r\n }\r\n #onclick = (e: Event) => {\r\n const $t = e.target as Element;\r\n const $item = $t.closest(itemTagName) as ComboItem;\r\n if (!$item) return;\r\n\r\n const data = $item.model?.data;\r\n if (!data) return;\r\n\r\n const ls = this.model?.listSource;\r\n if (!ls) return;\r\n\r\n const a = !$item.active; //true = 要求选中\r\n const s = this.model!.activeItems;\r\n\r\n if (ls.multiple) {\r\n if (a) {\r\n s.add(data);\r\n }\r\n else {\r\n s.delete(data); //取消选中\r\n }\r\n $item.setModelProperty('active', a);\r\n }\r\n else {\r\n this.$viewItems.filter($i => $i.active).forEach($i => $i.setModelProperty('active', false));\r\n s.clear();\r\n\r\n if (a) {\r\n s.add(data);\r\n $item.setModelProperty('active', true);\r\n }\r\n else {\r\n //取消选中,无需做什么,因为上面已经把所有已经选中的取消了。\r\n }\r\n }\r\n\r\n this.model?.activeItemsChanged?.(s);\r\n }\r\n\r\n\r\n //#region ViewListElement\r\n protected _getViewItemTagName(): string {\r\n return itemTagName;\r\n }\r\n\r\n get $viewItemsContainer() {\r\n return this.$section;\r\n }\r\n\r\n protected $section = document.createElement('section');\r\n //#endregion\r\n\r\n //#region 属性\r\n set listSource(l: ListSource<object>) {\r\n if (!l) {\r\n this.setModelProperty(\"modelList\", []);\r\n return;\r\n }\r\n const items: ComboItemOptions[] = l.getStrArray();\r\n this.setModelProperty(\"modelList\", items);\r\n\r\n const str = new Array<string>(l.valueMember.length + l.labelMember.length + 1).fill('auto').join(' ');\r\n this.$section.style.gridTemplateColumns = str;\r\n }\r\n set activeItems(items: Set<object>) {\r\n if (!items) {\r\n return;\r\n }\r\n const $items = this.$viewItems;\r\n let $lastItem: ComboItem | null = null;\r\n\r\n for (const $item of $items) {\r\n const active = items.has($item.model!.data);\r\n $item.setModelProperty('active', active);\r\n if (active) {\r\n $lastItem = $item;\r\n }\r\n }\r\n \r\n if ($lastItem?.isConnected) {\r\n this.#scrollIntoView($lastItem);\r\n }\r\n /* 当网页有滚动栏,会一起滚动。希望只在 $section 中滚动。\r\n $lastItem?.$icon.scrollIntoView({\r\n block: 'end', //因为是最后一个选中项\r\n //container: 'nearest' 文档上有?\r\n });*/\r\n }\r\n\r\n /**\r\n * 将选中项滚动到视图内,因为 $item 本身 display=contents,所以用 $icon\r\n * @param $item\r\n */\r\n #scrollIntoView($item: ComboItem) {\r\n const $s = this.$section;\r\n if ($s.offsetHeight >= $s.scrollHeight) {\r\n //说明没有出现滚动条\r\n return;\r\n }\r\n const $icon = $item.$icon;\r\n if ($icon.offsetParent !== $s.offsetParent) {\r\n //下面的代码用了offsetTop,所以必须保证 $icon 和 $s 在同一个 offsetParent 中。\r\n //它们的 offsetParent 都是 document.body。\r\n return;\r\n }\r\n\r\n const iconPos = $icon.offsetTop + $icon.offsetHeight;\r\n const diff = iconPos - $s.scrollTop - $s.offsetTop - $s.clientHeight;\r\n if (diff > 0) {\r\n $s.scrollTo(0, $s.scrollTop + diff);\r\n }\r\n }\r\n\r\n @strAttr\r\n accessor emptyTip: string | undefined;\r\n //#endregion\r\n}","import { defineElement, utilityStyle, baseStyle, strAttr, CornerHelper, xy, createTxtBtn, type AttributeHandlers } from \"@gzmjs/ui-basic\";\r\nimport { type ListSource } from \"@gzmjs/mvvm\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { ComboList, tagName as listTagName } from './25-comboList';\r\nimport { iptStyle } from \"./00-common\";\r\n\r\nexport const tagName = 'GZM-INPUT-COMBO';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: ComboInput;\r\n }\r\n}\r\n\r\nexport interface InputComboOptions extends InputOptions<unknown, ComboInput> {\r\n tagName?: typeof tagName;\r\n\r\n listSource: ListSource<object>;\r\n\r\n /**\r\n * 当 listSource.multiple = true 时,显示选中多项用此符号隔开。\r\n */\r\n multipleDelimiter?: string;\r\n\r\n /**\r\n * 传递给 combo-list\r\n */\r\n emptyTip?: string;\r\n}\r\n\r\nconst mutableAttributes = ['name', 'required', 'multiple-delimiter'] as const;\r\nconst copyAttributes = inputCopyAttributes;\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class ComboInput extends InputBase<unknown, InputComboOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n\r\n protected _createInput(): HTMLInputElement {\r\n const $ipt = document.createElement('input');\r\n $ipt.className = 'ipt';\r\n $ipt.type = 'text';\r\n $ipt.oninput = () => this.#filterItems();\r\n $ipt.onchange = () => this.#checkTxt();//当失去焦点,change 在 blur 之前\r\n\r\n const $btn = createTxtBtn('⋮');\r\n $btn.onclick = () => {\r\n if (!this.disabled) {\r\n this.#showList();\r\n }\r\n };\r\n\r\n const $div = document.createElement(\"div\");\r\n $div.style.display = 'flex';\r\n $div.append($ipt, $btn);\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($div);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, utilityStyle, iptStyle];\r\n sr.append($lbl);\r\n\r\n return $ipt;\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare $ipt: HTMLInputElement;\r\n\r\n protected _showValue($ipt = this.$ipt) {\r\n const nv = this.listSource?.getListDisplay(this.dsValue).toString(this) ?? '';\r\n if ($ipt.value === nv) return;\r\n \r\n $ipt.value = nv;\r\n this._setValidity($ipt);\r\n\r\n //直接设置 ipt.value 不会触发 change 事件,在 form 中就无法正确显示 validity\r\n //同时为了不让 _createInput() 中的 change 事件触发,这里使用 this.dispatchEvent\r\n //todo: this.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n #filterItems() {\r\n const $list = this.$currentList ?? this.#showList();\r\n if ($list) {\r\n const txt = this.$ipt.value;\r\n $list.$viewItems.forEach($i => $i.setModelProperty('hidden', !$i.innerText.includes(txt)));\r\n }\r\n }\r\n /**\r\n * 当手工输入文本,要保证其与选中项一致!\r\n * 对于单字段的数据源比较好用,多字段要用半角逗号隔开值。\r\n * 对于多选要用 multipleDelimiter 隔开。\r\n */\r\n #checkTxt($ipt = this.$ipt) {\r\n const txt = $ipt.value;\r\n const ls = this.listSource;\r\n\r\n if (!txt || !ls) {\r\n //人工清空,就是删除所有选中项\r\n this.dataValue = void 0;\r\n $ipt.value = '';\r\n this._setValidity($ipt);\r\n return;\r\n }\r\n\r\n if (txt === ls.getListDisplay(this.dsValue).toString(this)) {\r\n return;\r\n }\r\n\r\n //通过手工录入的数据去查找对应的项,进而设置 dataValue,最终体现在 $ipt.value 上。\r\n if (ls.multiple) {\r\n const sa = txt.split(this.multipleDelimiter);\r\n const oa = ls.findMultiple(sa);\r\n if (oa.length === 0) {\r\n this.dataValue = void 0;\r\n }\r\n else {\r\n this._setActiveItem(...oa);\r\n }\r\n }\r\n else {\r\n const o = ls.find(txt);\r\n if (o) {\r\n this._setActiveItem(o);\r\n }\r\n else {\r\n this.dataValue = void 0;\r\n }\r\n }\r\n this._showValue();\r\n }\r\n \r\n //#region 显示列表\r\n #showList(ls = this.listSource) {\r\n this.$currentList?.remove();\r\n this.#currentList = void 0;\r\n\r\n if (!ls) {\r\n return;\r\n }\r\n\r\n const $list = document.createElement(listTagName);\r\n $list.setAttribute('popover', 'auto');\r\n $list.className = 'gzm-frame';\r\n $list.ontoggle = (e: ToggleEvent) => {\r\n if (e.newState === 'closed') {\r\n $list.remove();\r\n this.#currentList = void 0;\r\n }\r\n };\r\n $list.model = {\r\n modelList: [],\r\n listSource: ls,\r\n activeItems: new Set(ls.getListItems(this.dsValue)),\r\n emptyTip: this.emptyTip,\r\n activeItemsChanged: (activeItems: Set<object>) => {\r\n this._setActiveItem(...activeItems);\r\n this._showValue();\r\n if (!ls.multiple) {\r\n $list.remove();\r\n this.#currentList = void 0;\r\n }\r\n }\r\n };\r\n this.#currentList = new WeakRef($list);\r\n\r\n //this.append($list);作为子元素添加就显示不出来了!?\r\n new CornerHelper($list, xy.rightTop, this, xy.rightBottom).pos();\r\n return $list;\r\n }\r\n\r\n get $currentList(): ComboList | undefined {\r\n return this.#currentList?.deref();\r\n }\r\n #currentList?: WeakRef<ComboList>;\r\n //#endregion\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor multipleDelimiter: string = ' | ';\r\n\r\n @strAttr\r\n accessor emptyTip: string | undefined;\r\n\r\n _multiple_delimiter_set() {\r\n this._showValue();\r\n }\r\n //#endregion\r\n}","import { defineElement, createStyleSheet, baseStyle, strAttr, type AttributeHandlers } from \"@gzmjs/ui-basic\";\r\nimport { type ListSource } from \"@gzmjs/mvvm\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { ComboList, tagName as listTagName } from './25-comboList';\r\n\r\nexport const tagName = 'GZM-CHECK-LIST';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: CheckList;\r\n }\r\n}\r\nconst styleSheet = createStyleSheet({\r\n ':host': `\r\n display: inline-flex;\r\n flex-direction: column-reverse;\r\n `,\r\n [listTagName]: `\r\n flex: auto;\r\n background-color: transparent;\r\n outline-width: 0px;\r\n border-radius: 0.375rem;\r\n padding: 0.25rem;\r\n `,\r\n //为了这里 + 即相邻的兄弟元素,布局方向为 column-reverse。\r\n [`label:has(input:invalid) + ${listTagName}`]: `\r\n outline-style: dashed;\r\n outline-width: 2px;\r\n outline-color: var(--gzm-error-txt-color);\r\n `,\r\n [`label:has(input:invalid)::after`]: `\r\n content: attr(validation-message);\r\n font-size: 0.75rem;\r\n padding: 0.125rem;\r\n color: var(--gzm-error-txt-color);\r\n `,\r\n});\r\nexport interface CheckListOptions extends InputOptions<unknown, CheckList> {\r\n tagName?: typeof tagName;\r\n\r\n listSource: ListSource<object>;\r\n\r\n /**\r\n * 传递给 combo-list\r\n */\r\n emptyTip?: string;\r\n}\r\n\r\nconst mutableAttributes = ['name', 'required', 'empty-tip'] as const;\r\nconst copyAttributes = Object.assign({\r\n 'empty-tip': '$list'\r\n}, inputCopyAttributes);\r\n\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class CheckList extends InputBase<unknown, CheckListOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n \r\n constructor() {\r\n super();\r\n\r\n this.$list = document.createElement(listTagName);\r\n this.shadowRoot.append(this.$list); //注意布局方向为 column-reverse。\r\n }\r\n\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare readonly $ipt: HTMLInputElement;\r\n $list: ComboList;\r\n\r\n protected _createInput(): HTMLInputElement {\r\n const $ipt = document.createElement('input');\r\n $ipt.hidden = true;\r\n $ipt.title = 'for :invalid only'; //去掉 edge 浏览器的错误警告\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($ipt);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, styleSheet];\r\n sr.append($lbl);\r\n\r\n return $ipt;\r\n }\r\n\r\n protected _showValue(): void {\r\n const $l = this.$list;\r\n const ls = this.listSource;\r\n if (!ls) {\r\n $l.model = void 0;\r\n return;\r\n }\r\n\r\n const activeItems = new Set(ls.getListItems(this.dsValue));\r\n\r\n if (!$l.model) {\r\n $l.model = {\r\n modelList: [],\r\n listSource: ls,\r\n activeItems,\r\n activeItemsChanged: (activeItems: Set<object>) => {\r\n this._setActiveItem(...activeItems);\r\n }\r\n };\r\n }\r\n else {\r\n $l.setModelProperty('listSource', ls); //如果就是原来的 ls,什么都不会发生。\r\n $l.setModelProperty('activeItems', activeItems);\r\n }\r\n }\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor emptyTip: string | undefined;\r\n //#endregion\r\n}\r\n","import { defineElement, createStyleSheet, generateId, strAttr, type AttributeHandlers, baseStyle, createText } from \"@gzmjs/ui-basic\";\r\nimport { ListSource, ObjMember } from \"@gzmjs/mvvm\";\r\nimport { InputBase, inputCopyAttributes, type InputOptions } from \"./01-input\";\r\nimport { ComboList, tagName as listTagName } from './25-comboList';\r\n\r\nconst zh = {\r\n qbPlaceholder: '输入文本,按回车搜索',\r\n noListSource: '无效的选择列表,无法搜索',\r\n noRecord: '未搜索到记录'\r\n} as const;\r\nconst texts = {\r\n zh\r\n};\r\n\r\nexport const tagName = 'GZM-SEARCH-LIST';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: SearchList;\r\n }\r\n}\r\n\r\nconst styleSheet = createStyleSheet({\r\n ':host': `\r\n display: inline-flex;\r\n flex-direction: column-reverse;\r\n `,\r\n 'input[type=search]': `\r\n min-width: 0px;\r\n outline-width: 0px;\r\n background-color: transparent;\r\n border-bottom: var(--gzm-btn-border);\r\n border-bottom-width: 2px;\r\n text-align: center;\r\n margin-inline: 0.5rem;\r\n margin-bottom: 0.25rem;\r\n `,\r\n //查询过程中的错误信息\r\n 'input[type=search] ~ p': `\r\n text-align: center;\r\n color: var(--gzm-error-txt-color);\r\n font-size: 75%;\r\n `,\r\n\r\n [listTagName]: `\r\n flex: auto;\r\n background-color: transparent;\r\n outline-width: 0px;\r\n border-radius: 0.375rem;\r\n padding: 0.25rem;\r\n `,\r\n //为了这里 + 即相邻的兄弟元素,布局方向为 column-reverse。\r\n [`label:has(input:invalid) + ${listTagName}`]: `\r\n outline-style: dashed;\r\n outline-width: 2px;\r\n outline-color: var(--gzm-error-txt-color);\r\n `,\r\n [`label:has(input:invalid)::after`]: `\r\n content: attr(validation-message);\r\n font-size: 0.75rem;\r\n padding: 0.125rem;\r\n color: var(--gzm-error-txt-color);\r\n `,\r\n});\r\n\r\nexport interface SearchListOptions extends InputOptions<unknown, SearchList> {\r\n tagName?: typeof tagName;\r\n\r\n listSource: ListSource<object>;\r\n\r\n /**\r\n * 传递给 combo-list\r\n */\r\n emptyTip?: string;\r\n\r\n search?: (txt: string) => object[] | Promise<object[]>;\r\n}\r\n\r\nconst mutableAttributes = ['name', 'required', 'empty-tip'] as const;\r\nconst copyAttributes = Object.assign({\r\n 'empty-tip': '$list'\r\n}, inputCopyAttributes);\r\n\r\n/**\r\n * 基本上就是 check-list 的基础上添加了一个 input[search]。\r\n * 要实现到服务器端搜索,需要从 SearchListSource 继承后重写 search() 方法。\r\n */\r\n@defineElement({tagName, mutableAttributes, copyAttributes})\r\nexport class SearchList extends InputBase<unknown, SearchListOptions> implements AttributeHandlers<Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>> {\r\n static formAssociated = true;\r\n \r\n constructor() {\r\n super();\r\n\r\n const $qb = this.$qb = document.createElement('input');\r\n $qb.type = 'search';\r\n $qb.id = generateId();\r\n $qb.placeholder = this.T.qbPlaceholder; //去掉 edge 浏览器的错误警告\r\n $qb.addEventListener('search', () => this.#doSearch());\r\n\r\n this.$list = document.createElement(listTagName);\r\n this.shadowRoot.append(this.$list, $qb); //注意布局方向为 column-reverse。\r\n }\r\n\r\n declare readonly shadowRoot: ShadowRoot;\r\n declare readonly $ipt: HTMLInputElement;\r\n $list: ComboList;\r\n $qb: HTMLInputElement;\r\n\r\n protected _createInput(): HTMLInputElement {\r\n const $ipt = document.createElement('input');\r\n $ipt.hidden = true;\r\n $ipt.title = 'for :invalid only'; //去掉 edge 浏览器的错误警告\r\n\r\n const $lbl = document.createElement('label');\r\n $lbl.appendChild($ipt);\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, styleSheet];\r\n sr.append($lbl);\r\n\r\n return $ipt;\r\n }\r\n\r\n protected _showValue(): void {\r\n const $l = this.$list;\r\n const ls = this.listSource;\r\n if (!ls) {\r\n $l.model = void 0;\r\n return;\r\n }\r\n\r\n const activeItems = new Set(ls.getListItems(this.dsValue));\r\n\r\n if (!$l.model) {\r\n $l.model = {\r\n modelList: [],\r\n listSource: ls,\r\n activeItems,\r\n activeItemsChanged: (activeItems: Set<object>) => {\r\n this._setActiveItem(...activeItems);\r\n }\r\n };\r\n }\r\n else {\r\n $l.setModelProperty('listSource', ls); //如果就是原来的 ls,什么都不会发生。\r\n $l.setModelProperty('activeItems', activeItems);\r\n }\r\n }\r\n\r\n //#region 搜索\r\n async #doSearch() {\r\n const txt = this.$qb.value;\r\n if (!txt) return;\r\n\r\n const ls = this.listSource;\r\n if (!ls) {\r\n this.#showNoRecordInfo(this.T.noListSource);\r\n return;\r\n }\r\n\r\n let ret = this.model?.search?.(txt) ?? this.#searchListSource(txt);\r\n if (ret instanceof Promise) {\r\n ret = await ret;\r\n }\r\n if (!ret.length) {\r\n this.#showNoRecordInfo();\r\n }\r\n else {\r\n this.#afterSearch(ret, ls);\r\n }\r\n }\r\n\r\n /**\r\n * model 中没有 search 的时候调用,就在 listSource.list 中查找。\r\n * @param txt \r\n */\r\n #searchListSource(txt: string): object[] {\r\n const ls = this.listSource;\r\n if (!ls) return [];\r\n return ls.search(txt);\r\n }\r\n\r\n /**\r\n * 搜索结束后调用此方法来更新列表项\r\n * @param {Array} newItems 数据项数组\r\n */\r\n #afterSearch(newItems: object[], ls = this.listSource!) {\r\n const activeItems = ls.getListItems(this.dsValue);\r\n if (activeItems.length) {\r\n newItems = this.#removeDuplicated(newItems, activeItems, ls.valueMember);\r\n }\r\n this.listSource = new ListSource<object>(newItems, ls.valueMember, ls.labelMember, ls.multiple);\r\n }\r\n\r\n /**\r\n * 去掉 newItems 和 ais 中的重复项\r\n * @param newItems \r\n * @param ais \r\n * @returns 两者合并后的数组\r\n */\r\n #removeDuplicated(newItems: object[], ais: object[], vm: ObjMember) {\r\n for (let i = newItems.length - 1; i >= 0; i--) {\r\n const ni = newItems[i];\r\n if (!ni || ais.some(ai => this.#equal(ni, ai, vm))) {\r\n //重复,所以要移除\r\n newItems.splice(i, 1);\r\n }\r\n }\r\n return ais.concat(newItems);\r\n }\r\n\r\n /**\r\n * 根据 valueMember 来比较两个对象,相等返回 true\r\n * @param {*} ni \r\n * @param {*} ai \r\n */\r\n #equal(ni: object, ai: object, vm: ObjMember) {\r\n const nov = vm.getObjValue(ni);\r\n const aov = vm.getObjValue(ai);\r\n return nov.equals(aov);\r\n }\r\n\r\n #showNoRecordInfo(tc = this.T.noRecord) {\r\n const $p = document.createElement('p');\r\n $p.textContent = tc;\r\n this.$qb.after($p);\r\n window.setTimeout(() => $p.remove(), 2000); //只显示 2 秒\r\n }\r\n //#endregion\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor emptyTip: string | undefined;\r\n //#endregion\r\n\r\n readonly T = createText(texts).bindHtmlElement(this);\r\n}","import { createStyleSheet, gzmHeader } from \"@gzmjs/ui-basic\";\r\nimport { multipleSubscribers } from \"@gzmjs/mvvm\";\r\nimport type { FormInputOptions } from \"./95-form-input\";\r\nimport type { FormInputGroupOptions } from \"./96-form-group\";\r\nimport type { FormListOptions } from \"./97-form-list\";\r\n\r\nexport const formInputTagName = 'GZM-FORM-INPUT';\r\nexport const formGroupTagName = 'GZM-INPUT-GROUP';\r\nexport const formListTagName = 'GZM-FORM';\r\n\r\nexport const styleSheet = createStyleSheet({\r\n ':host': `\r\n display: flex;\r\n overflow: hidden;\r\n `,\r\n 'form': `\r\n display: flex;\r\n flex-direction: column;\r\n flex-wrap: wrap;\r\n gap: 1rem;\r\n max-height: 100%;\r\n max-width: 100%;\r\n overflow: auto;\r\n `,\r\n\r\n /*分为 3 列*/ /*81-4个中文,113-6个中文*/ /*120px日期输入能够显示完整*/\r\n [formGroupTagName]: `\r\n display: grid;\r\n grid-template-columns: min-content minmax(auto,113px) minmax(120px,auto);\r\n `,\r\n [formGroupTagName + ' > span']: `\r\n text-align: center;\r\n padding: 0.25rem;\r\n ` + gzmHeader,\r\n\r\n //显示 label\r\n [formGroupTagName + ' > span:nth-of-type(2)']: `\r\n grid-column: 2 / span 2;\r\n border-left-width: 0px;\r\n padding-inline: 0.5rem;\r\n `,\r\n [formGroupTagName + ' > section']: `\r\n display: contents;\r\n `,\r\n\r\n //单个 input\r\n [formInputTagName]: `\r\n display: contents;\r\n `,\r\n //行头\r\n [formInputTagName + '> div']: `\r\n padding: 0.5rem 0.25rem;\r\n text-align: center;\r\n ` + gzmHeader,\r\n [formInputTagName + '> *:not(:first-child)']: `\r\n border: var(--gzm-header-border);\r\n border-left-width: 0px;\r\n padding: 0.5rem 0.25rem;\r\n `,\r\n /*不显示上边框,这样就不会和上一行的下边框重叠。不过 group 的头可能不显示,所以要排除第一个。*/\r\n [formInputTagName + ':not(:first-of-type) > *']: `\r\n border-top-width: 0px !important;\r\n `,\r\n // label 如果同时有 title 属性,则显示为 details\r\n [formInputTagName + '> label > details > summary']: `\r\n list-style-type: none;\r\n text-decoration: underline dashed;\r\n cursor: help;\r\n `,\r\n});\r\n\r\n/**\r\n * 《model 与 data 的融合.md》非 PlainObject 化\r\n * 同时允许非代理对象作为数据源\r\n * @param ds \r\n * @param model \r\n * @returns \r\n */\r\nexport function checkDataSource(ds: object, model?: FormListOptions | FormInputGroupOptions | FormInputOptions) {\r\n if (ds !== model?.dataSource) {\r\n return;\r\n }\r\n\r\n if (multipleSubscribers in model) {\r\n //说明 model 被代理,那么 ds 必须调用 createDataSource 创建\r\n if (model[multipleSubscribers] !== true) {\r\n throw new Error('dataSource 的原型必须为 null,请调用 createDataSource() 创建 dataSource 对象。');\r\n }\r\n }\r\n else {\r\n //说明 model 没有被代理,那么 ds 可以是任意对象(也可以通过 createDataSource() 生成)\r\n }\r\n}","import { defineElement, type AttributeHandlers, strAttr } from \"@gzmjs/ui-basic\";\r\nimport { type ViewModel, ViewElement } from \"@gzmjs/mvvm\";\r\nimport { tagName as inputLabelTagName, type InputLabelOptions, InputLabel } from \"./03-label\";\r\nimport type { InputTextOptions } from \"./06-text\";\r\nimport type { InputCalOptions } from \"./09-cal\";\r\nimport type { InputCheckOptions } from \"./12-check\";\r\nimport type { InputNumOptions } from \"./15-num\";\r\nimport type { InputColorOptions } from \"./18-color\";\r\nimport type { InputLinesOptions } from \"./21-lines\";\r\nimport type { InputComboOptions } from \"./26-combo\";\r\nimport type { CheckListOptions } from \"./27-checklist\";\r\nimport type { SearchListOptions } from \"./30-search-list\";\r\nimport type { FormInputGroup } from \"./96-form-group\";\r\nimport { formInputTagName, formGroupTagName, checkDataSource } from \"./94.form\";\r\nimport { InputDataSource } from \"./01-input\";\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [formInputTagName]: FormInput;\r\n }\r\n}\r\n\r\ntype AllInputTypes = InputLabelOptions | InputTextOptions | InputCalOptions | InputCheckOptions | InputNumOptions | InputColorOptions | InputLinesOptions | InputComboOptions | CheckListOptions | SearchListOptions;\r\nexport interface FormInputOptions extends ViewModel<FormInput> {\r\n label: string;\r\n input: AllInputTypes;\r\n dataSource?: object;\r\n}\r\n\r\nconst mutableAttributes = ['label', 'title'] as const;\r\n\r\n@defineElement({tagName: formInputTagName, mutableAttributes})\r\nexport class FormInput extends ViewElement<FormInputOptions> implements AttributeHandlers<typeof mutableAttributes[number]> {\r\n\r\n //#region 子元素\r\n get $head(): HTMLElement {\r\n if (!this.#head) {\r\n this.#head = document.createElement('div');\r\n this.#head.innerHTML = '<span style=\"visibility:hidden;\">✶</span>'; //✶✵✶✷ 几个备选的字符,代表已经修改过了。\r\n this.prepend(this.#head);\r\n }\r\n return this.#head;\r\n }\r\n #head?: HTMLElement;\r\n\r\n get $label(): HTMLLabelElement {\r\n if (!this.#label) {\r\n this.#label = document.createElement('label');\r\n this.$head.after(this.#label);\r\n }\r\n return this.#label;\r\n }\r\n #label?: HTMLLabelElement;\r\n\r\n /**\r\n * <gzm-input-*>\r\n * 可能不是 InputLabel,但是它们都有共同的基类,所以用 Label 来欺骗 TypeScript。\r\n */\r\n $ipt?: InputLabel;\r\n\r\n /**\r\n * 在录入组件和 label 之间切换,其实就是用来生成 $ipt。\r\n * @param readonly - 必须是所属组的 readonly,所以请等到 connectedCallback() 后再调用!\r\n */\r\n switchLabel(readonly = this.$group?.readonly ?? false) {\r\n let $ipt = this.$ipt;\r\n\r\n if (readonly) {\r\n if (!$ipt) {\r\n $ipt = this.#createLabel();\r\n this.append($ipt);\r\n }\r\n else if ($ipt.tagName !== inputLabelTagName) {\r\n //https://devdocs.io/dom/element/replacewith\r\n $ipt.replaceWith(this.#createLabel());\r\n }\r\n }\r\n else {\r\n if (!$ipt) {\r\n $ipt = this.#createInput();\r\n this.append($ipt);\r\n }\r\n else if ($ipt.tagName !== this.input?.tagName) {\r\n //https://devdocs.io/dom/element/replacewith\r\n $ipt.replaceWith(this.#createInput());\r\n }\r\n }\r\n if (this.#ds) {\r\n this.dataSource = this.#ds;\r\n }\r\n }\r\n #createLabel() {\r\n const $ret = document.createElement(inputLabelTagName);\r\n $ret.model = this.input as InputLabelOptions;\r\n return this.$ipt = $ret;\r\n }\r\n #createInput(input = this.input) {\r\n if (!input?.tagName) {\r\n throw new Error('no input model tagName');\r\n }\r\n const $ret = document.createElement(input.tagName);\r\n $ret.model = input; \r\n this.$ipt = $ret as InputLabel;\r\n\r\n //强制开启显示验证信息功能。\r\n this.$ipt.setModelProperty('showValidityMessage', true);\r\n\r\n this.#monitorDataValue();\r\n return this.$ipt;\r\n }\r\n //#endregion\r\n\r\n //#region group\r\n get $group() : FormInputGroup | null {\r\n return this.closest(formGroupTagName) as FormInputGroup;\r\n }\r\n\r\n connectedCallback() {\r\n //因为需要 group.readonly。\r\n this.switchLabel();\r\n }\r\n //#endregion\r\n\r\n //#region 值改变\r\n #iptValue: unknown;\r\n\r\n #monitorDataValue() {\r\n const input = this.input!;\r\n let original = input.dataValueChanged;\r\n if (original) {\r\n original = original.bind(input);\r\n }\r\n input.dataValueChanged = (newValue: unknown, oldValue: unknown) => {\r\n this.#checkValueChange();\r\n original?.(newValue, oldValue);\r\n };\r\n }\r\n #checkValueChange($ipt = this.$ipt) {\r\n if (!$ipt) {\r\n return;\r\n }\r\n const dv = $ipt.dataValue;\r\n //console.log(dv, this.#iptValue);\r\n\r\n //两个值中至少有一个不能是空值(falsy),如果两个值都是空值,就不算改变。因为 <input> 的默认值是空字符串。\r\n // 因为 +0 !== -0 而且 NaN !== NaN,所以要用 Object.is(dv, this.#iptValue)。\r\n const changed = (dv !== this.#iptValue) && !!(dv || this.#iptValue);\r\n this.#showChangedMark(changed);\r\n }\r\n #showChangedMark(changed: boolean) {\r\n const $fec = this.$head.firstElementChild as HTMLElement;\r\n $fec.style.visibility = changed ? 'visible' : 'hidden';//使用 visibility 而不是 替换内部的文本,可以保证宽度不变。\r\n }\r\n //#endregion\r\n\r\n //#region 属性\r\n @strAttr\r\n accessor label: string | undefined;\r\n\r\n _label_set() {\r\n this.#showLabelAndTitle();\r\n }\r\n _title_set() {\r\n this.#showLabelAndTitle();\r\n }\r\n #showLabelAndTitle() {\r\n const t = this.title;\r\n if (!t) {\r\n this.$label.textContent = this.label ?? '';\r\n return;\r\n }\r\n\r\n this.$label.innerHTML = '';//清空\r\n\r\n const $summary = document.createElement('summary');\r\n $summary.textContent = this.label ?? '';\r\n\r\n const $small = document.createElement('small');\r\n $small.innerHTML = t.replaceAll('\\n', '<br>');\r\n\r\n const $details = document.createElement('details');\r\n $details.append($summary, $small);\r\n\r\n this.$label.appendChild($details);\r\n }\r\n\r\n get dataSource(): object | undefined {\r\n return this.#ds;\r\n }\r\n set dataSource(ds: object) {\r\n checkDataSource(ds, this.model);\r\n this.#ds = ds;\r\n\r\n const $ipt = this.$ipt;\r\n if (!$ipt) return;\r\n\r\n const old = $ipt.dataSource;\r\n const nds = old ? new InputDataSource(ds, old.valueMember) : new InputDataSource(ds, $ipt.name!);//model.name 是必须要有的,而且一般就是字段名称!\r\n $ipt.setModelProperty('dataSource', nds);\r\n\r\n this.#iptValue = $ipt.dataValue;\r\n this.#showChangedMark(false);\r\n }\r\n #ds?: object;\r\n\r\n get input() {\r\n return this.#inputModel;\r\n }\r\n set input(v: AllInputTypes | undefined) {\r\n this.#inputModel = v;\r\n this.$ipt?.remove();\r\n\r\n if (v && this.isConnected) {\r\n this.switchLabel();\r\n }\r\n }\r\n #inputModel?: AllInputTypes;\r\n //#endregion \r\n}","import { GT, defineElement, boolAttr, strAttr, type AttributeHandlers, createTxtBtn } from \"@gzmjs/ui-basic\";\r\nimport { ViewListElement, type ViewListModel } from \"@gzmjs/mvvm\";\r\nimport { type FormInput, type FormInputOptions } from \"./95-form-input\";\r\nimport { formGroupTagName, formInputTagName, checkDataSource } from \"./94.form\";\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [formGroupTagName]: FormInputGroup;\r\n }\r\n}\r\n\r\nexport interface FormInputGroupOptions extends ViewListModel<FormInputOptions, FormInput, FormInputGroup> {\r\n label?: string;\r\n collapsed?: boolean;\r\n\r\n /**\r\n * 需要放在 modelList 之后!\r\n */\r\n readonly?: boolean;\r\n\r\n /**\r\n * 需要放在 modelList 之后!\r\n */\r\n dataSource?: object;\r\n}\r\n\r\nconst mutableAttributes = ['label', 'collapsed', 'readonly'] as const;\r\n\r\n@defineElement({tagName: formGroupTagName, mutableAttributes})\r\nexport class FormInputGroup extends ViewListElement<FormInputOptions, FormInput, FormInputGroupOptions> implements AttributeHandlers<typeof mutableAttributes[number]> {\r\n\r\n //#region 子元素\r\n get $head() {\r\n if (!this.#head) {\r\n const $hd = document.createElement('span');\r\n $hd.onclick = e => {\r\n //console.debug('group click');\r\n this.setModelProperty('collapsed', !this.collapsed);\r\n e.stopPropagation(); //https://devdocs.io/dom/event/stoppropagation\r\n };\r\n this.prepend($hd);\r\n this.#head = $hd;\r\n\r\n if (!this.#icn) {\r\n this.#icn = createTxtBtn(iconExpanded)\r\n $hd.append(this.#icn);\r\n }\r\n }\r\n return this.#head;\r\n }\r\n #head?: HTMLElement;\r\n\r\n get $icn() {\r\n if (!this.#icn) {\r\n this.#icn = createTxtBtn(iconExpanded)\r\n this.$head.append(this.#icn);\r\n }\r\n return this.#icn;\r\n }\r\n #icn?: HTMLButtonElement;\r\n\r\n get $lbl() {\r\n if (!this.#lbl) {\r\n this.#lbl = document.createElement('span');\r\n this.$head.after(this.#lbl);\r\n }\r\n return this.#lbl;\r\n }\r\n #lbl?: HTMLElement;\r\n\r\n get $section() {\r\n if (!this.#section) {\r\n this.#section = document.createElement('section');\r\n this.append(this.#section);\r\n }\r\n return this.#section;\r\n }\r\n #section?: HTMLElement;\r\n //#endregion\r\n\r\n //#region ViewListElement\r\n protected _getViewItemTagName(): string {\r\n return formInputTagName;\r\n }\r\n\r\n public get $viewItemsContainer(): HTMLElement | ShadowRoot {\r\n return this.$section;\r\n }\r\n //#endregion\r\n\r\n //#region 属性\r\n set dataSource(ds: object) {\r\n checkDataSource(ds, this.model);\r\n this.$viewItems.forEach($ipt => $ipt.setModelProperty('dataSource', ds));\r\n }\r\n\r\n @strAttr\r\n accessor label: string | undefined;\r\n\r\n _label_set() {\r\n this.#showLabel();\r\n }\r\n\r\n #showLabel() {\r\n let nv = this.label ?? '';\r\n if (this.readonly) {\r\n nv += ` [${GT.readonly}]`;\r\n }\r\n\r\n this.$lbl.textContent = nv;\r\n\r\n //如果没有 label 就不显示了,不要添加一个【默认】,尤其只有一个 group 的时候。\r\n const hidden = !nv\r\n this.$lbl.hidden = hidden;\r\n this.$head.hidden = hidden;\r\n }\r\n\r\n @boolAttr\r\n accessor collapsed: boolean = false;\r\n\r\n _collapsed_set() {\r\n this.$icn.textContent = this.collapsed ? iconCollapsed : iconExpanded;\r\n this.$section.hidden = this.collapsed;\r\n }\r\n\r\n @boolAttr\r\n accessor readonly: boolean = false;\r\n\r\n _readonly_set() {\r\n const ro = this.readonly;\r\n this.$viewItems.forEach($ipt => $ipt.switchLabel(ro));\r\n this.#showLabel();\r\n }\r\n //#endregion\r\n}\r\n\r\nconst iconCollapsed = '⊞';\r\nconst iconExpanded = '⊟';","import { defineElement, boolAttr, baseStyle, utilityStyle, type AttributeHandlers } from \"@gzmjs/ui-basic\";\r\nimport { ViewListElement, type ViewListModel } from \"@gzmjs/mvvm\";\r\nimport { type FormInputGroup, type FormInputGroupOptions } from \"./96-form-group\";\r\nimport { formListTagName, formGroupTagName, styleSheet, checkDataSource } from \"./94.form\";\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [formListTagName]: FormList;\r\n }\r\n}\r\n\r\nexport interface FormListOptions extends ViewListModel<FormInputGroupOptions, FormInputGroup, FormList> {\r\n tagName?: typeof formListTagName;\r\n\r\n /**\r\n * 需要放在 modelList 之后!\r\n */\r\n readonly?: boolean;\r\n\r\n /**\r\n * 需要放在 modelList 之后!\r\n */\r\n dataSource?: object;\r\n}\r\n\r\nconst mutableAttributes = ['readonly'] as const;\r\n\r\n@defineElement({tagName: formListTagName, mutableAttributes})\r\nexport class FormList extends ViewListElement<FormInputGroupOptions, FormInputGroup, FormListOptions> implements AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [baseStyle, utilityStyle, styleSheet];\r\n sr.append(this.$form);\r\n }\r\n readonly $form = document.createElement('form');\r\n\r\n //#region 提交\r\n getFormData() {\r\n return new FormData(this.$form);\r\n }\r\n\r\n submit() {\r\n this.$form.submit();\r\n }\r\n\r\n checkValidity() {\r\n return this.$form.checkValidity();\r\n }\r\n //#endregion\r\n\r\n //#region ViewListElement\r\n protected _getViewItemTagName(): string {\r\n return formGroupTagName;\r\n }\r\n\r\n public get $viewItemsContainer(): HTMLElement | ShadowRoot {\r\n return this.$form;\r\n }\r\n //#endregion\r\n\r\n //#region 属性\r\n @boolAttr\r\n accessor readonly: boolean = false;\r\n\r\n _readonly_set() {\r\n const ro = this.readonly;\r\n this.$viewItems.forEach($g => $g.setModelProperty('readonly', ro));\r\n }\r\n\r\n /**\r\n * 必须要等到 modelList 处理完毕之后再调用!\r\n * 其实还有一种方法:queueMicrotask()\r\n */\r\n set dataSource(ds: object) {\r\n checkDataSource(ds, this.model);\r\n this.$viewItems.forEach($g => $g.setModelProperty('dataSource', ds));\r\n }\r\n //#endregion\r\n}"],"names":["_a","_ds","_init","__privateAdd","__publicField","__runInitializers","__privateMethod","__privateGet","__privateSet","__decoratorStart","__decorateElement","__decoratorMetadata","_multipleDelimiter_dec","_falseText_dec","_trueText_dec","_trueText","_falseText","_multipleDelimiter","tagName","mutableAttributes","copyAttributes","_list_dec","_placeholder_dec","_autoComplete_dec","_type_dec","_type","_autoComplete","_placeholder","_list","_min_dec","_max_dec","_autocomplete_dec","_dataType_dec","_dataType","_autocomplete","_max","_min","styleSheet","_emptyTip_dec","_emptyTip","itemTagName","listTagName","activeItems","_label_dec","_head","_label","inputLabelTagName","_readonly_dec","_readonly"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { tagName as inputLabelTagName, type InputLabelOptions, InputLabel } from './040-input/03-label';
|
|
2
|
+
export { tagName as inputTextTagName, type InputTextOptions, TextInput } from './040-input/06-text';
|
|
3
|
+
export { tagName as inputCalTagName, type InputCalOptions, CalInput } from './040-input/09-cal';
|
|
4
|
+
export { tagName as inputCheckTagName, type InputCheckOptions, CheckInput } from './040-input/12-check';
|
|
5
|
+
export { tagName as inputNumTagName, type InputNumOptions, NumInput } from './040-input/15-num';
|
|
6
|
+
export { tagName as inputColorTagName, type InputColorOptions, ColorInput } from './040-input/18-color';
|
|
7
|
+
export { tagName as inputLinesTagName, type InputLinesOptions, LinesInput } from './040-input/21-lines';
|
|
8
|
+
export { tagName as comboItemTagName, type ComboItemOptions, ComboItem } from './040-input/24-comboItem';
|
|
9
|
+
export { tagName as comboListTagName, type ComboListOptions, ComboList } from './040-input/25-comboList';
|
|
10
|
+
export { tagName as inputComboTagName, type InputComboOptions, ComboInput } from './040-input/26-combo';
|
|
11
|
+
export { tagName as checkListTagName, type CheckListOptions, CheckList } from './040-input/27-checklist';
|
|
12
|
+
export { tagName as searchListTagName, type SearchListOptions, SearchList } from './040-input/30-search-list';
|
|
13
|
+
export { formInputTagName, formGroupTagName, formListTagName } from './040-input/94.form';
|
|
14
|
+
export { type FormInputOptions, FormInput } from './040-input/95-form-input';
|
|
15
|
+
export { type FormInputGroupOptions, FormInputGroup } from './040-input/96-form-group';
|
|
16
|
+
export { type FormListOptions, FormList } from './040-input/97-form-list';
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gzmjs/form",
|
|
3
|
+
"description": "GZMJS UI Form Component",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"module": "dist/form.es.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"dev": "vite",
|
|
13
|
+
"build": "tsc && vite build",
|
|
14
|
+
"preview": "vite preview",
|
|
15
|
+
"analyzer": "vite-bundle-visualizer"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^25.1.0",
|
|
19
|
+
"eslint": "^9.39.2",
|
|
20
|
+
"typescript": "~5.9.3",
|
|
21
|
+
"typescript-eslint": "^8.54.0",
|
|
22
|
+
"vite": "^7.2.4",
|
|
23
|
+
"vite-bundle-visualizer": "^1.2.1",
|
|
24
|
+
"vite-plugin-dts": "^4.5.4"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@gzmjs/mvvm": "^0.1.0",
|
|
28
|
+
"@gzmjs/ui-basic": "^0.3.0"
|
|
29
|
+
}
|
|
30
|
+
}
|