UNPKG

@icreate/ics-mui

Version:

京东风格的轻量级移动端 Vue2、Vue3 组件库(支持小程序开发)

768 lines (767 loc) 18.6 kB
var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); import { reactive, computed, ref, watch, toRefs, defineComponent, toRef, openBlock, createElementBlock, Fragment, createElementVNode, createVNode, unref, withCtx, toDisplayString, renderSlot, renderList, normalizeClass, normalizeStyle } from "vue"; import "../input/Input.js"; import { I as IcsPopup } from "../index-kY3YH8kV.js"; import { I as IcsPickerColumn } from "../Column-BdcOilw3.js"; import { u as useLocale } from "../index-Dc5XFAmV.js"; import { u as useFormDisabled } from "../common-DXugw-he.js"; import { _ as _sfc_main$1 } from "../input.vue_vue_type_script_setup_true_lang-CUVjcKoZ.js"; import { w as withInstall } from "../with-install-DWwOiZS3.js"; const DEFAULT_FILED_NAMES = { text: "text", value: "value", children: "children", className: "className" }; const OPTIONS = [ [ { text: "00", value: "00" }, { text: "01", value: "01" }, { text: "02", value: "02" }, { text: "03", value: "03" }, { text: "04", value: "04" }, { text: "05", value: "05" }, { text: "06", value: "06" }, { text: "07", value: "07" }, { text: "08", value: "08" }, { text: "09", value: "09" }, { text: "10", value: "10" }, { text: "11", value: "11" }, { text: "12", value: "12" }, { text: "13", value: "13" }, { text: "14", value: "14" }, { text: "15", value: "15" }, { text: "16", value: "16" }, { text: "17", value: "17" }, { text: "18", value: "18" }, { text: "19", value: "19" }, { text: "20", value: "20" }, { text: "21", value: "21" }, { text: "22", value: "22" }, { text: "23", value: "23" } ], [ { text: "00", value: "00" }, { text: "01", value: "01" }, { text: "02", value: "02" }, { text: "03", value: "03" }, { text: "04", value: "04" }, { text: "05", value: "05" }, { text: "06", value: "06" }, { text: "07", value: "07" }, { text: "08", value: "08" }, { text: "09", value: "09" }, { text: "10", value: "10" }, { text: "11", value: "11" }, { text: "12", value: "12" }, { text: "13", value: "13" }, { text: "14", value: "14" }, { text: "15", value: "15" }, { text: "16", value: "16" }, { text: "17", value: "17" }, { text: "18", value: "18" }, { text: "19", value: "19" }, { text: "20", value: "20" }, { text: "21", value: "21" }, { text: "22", value: "22" }, { text: "23", value: "23" }, { text: "24", value: "24" }, { text: "25", value: "25" }, { text: "26", value: "26" }, { text: "27", value: "27" }, { text: "28", value: "28" }, { text: "29", value: "29" }, { text: "30", value: "30" }, { text: "31", value: "31" }, { text: "32", value: "32" }, { text: "33", value: "33" }, { text: "34", value: "34" }, { text: "35", value: "35" }, { text: "36", value: "36" }, { text: "37", value: "37" }, { text: "38", value: "38" }, { text: "39", value: "39" }, { text: "40", value: "40" }, { text: "41", value: "41" }, { text: "42", value: "42" }, { text: "43", value: "43" }, { text: "44", value: "44" }, { text: "45", value: "45" }, { text: "46", value: "46" }, { text: "47", value: "47" }, { text: "48", value: "48" }, { text: "49", value: "49" }, { text: "50", value: "50" }, { text: "51", value: "51" }, { text: "52", value: "52" }, { text: "53", value: "53" }, { text: "54", value: "54" }, { text: "55", value: "55" }, { text: "56", value: "56" }, { text: "57", value: "57" }, { text: "58", value: "58" }, { text: "59", value: "59" } ] ]; const usePicker = (props, emit) => { const state = reactive({ formattedColumns: props.columns.length ? props.columns : OPTIONS }); const columnFieldNames = computed(() => { return __spreadValues(__spreadValues({}, DEFAULT_FILED_NAMES), props.fieldNames); }); const defaultValues = ref([]); const defaultIndexes = computed(() => { const fields = columnFieldNames.value; return columnsList.value.map((column, index) => { const targetIndex = column.findIndex((item) => item[fields.value] === defaultValues.value[index]); return targetIndex === -1 ? 0 : targetIndex; }); }); const pickerColumn = ref([]); const swipeRef = (el) => { if (el && pickerColumn.value.length < columnsList.value.length) { pickerColumn.value.push(el); } }; const selectedOptions = computed(() => { const fields = columnFieldNames.value; return columnsList.value.map((column, index) => { return column.find((item) => item[fields.value] === defaultValues.value[index]) || column[0]; }); }); const columnsType = computed(() => { const firstColumn = state.formattedColumns[0]; const fields = columnFieldNames.value; if (firstColumn) { if (Array.isArray(firstColumn)) { return "multiple"; } if (fields.children in firstColumn) { return "cascade"; } } return "single"; }); const columnsList = computed(() => { let result = []; switch (columnsType.value) { case "multiple": result = state.formattedColumns; break; case "cascade": result = formatCascade(state.formattedColumns, defaultValues.value ? defaultValues.value : []); break; default: result = [state.formattedColumns]; break; } return result; }); const formatCascade = (columns, defaultValues2) => { const formatted = []; const fields = columnFieldNames.value; let cursor = { text: "", value: "", [fields.children]: columns }; let columnIndex = 0; while (cursor && cursor[fields.children]) { const options = cursor[fields.children]; const value = defaultValues2[columnIndex]; let index = options.findIndex((columnItem) => columnItem[fields.value] === value); if (index === -1) index = 0; cursor = cursor[fields.children][index]; columnIndex++; formatted.push(options); } return formatted; }; const cancel = () => { emit("cancel", { selectedValue: defaultValues.value, selectedOptions: selectedOptions.value }); }; const changeHandler = (columnIndex, option) => { var _a; const fields = columnFieldNames.value; if (option && Object.keys(option).length) { defaultValues.value = defaultValues.value ? defaultValues.value : []; if (columnsType.value === "cascade") { defaultValues.value[columnIndex] = (_a = option[fields.value]) != null ? _a : ""; let index = columnIndex; let cursor = option; while (cursor && cursor[fields.children] && cursor[fields.children][0]) { defaultValues.value[index + 1] = cursor[fields.children][0][fields.value]; index++; cursor = cursor[fields.children][0]; } if (cursor && cursor[fields.children] && cursor[fields.children].length === 0) { defaultValues.value = defaultValues.value.slice(0, index + 1); } } else { defaultValues.value[columnIndex] = Object.prototype.hasOwnProperty.call(option, fields.value) ? option[fields.value] : ""; } emit("change", { columnIndex, selectedValue: defaultValues.value, selectedOptions: selectedOptions.value }); } }; const confirm = () => { const fields = columnFieldNames.value; if (defaultValues.value && !defaultValues.value.length) { columnsList.value.forEach((columns) => { defaultValues.value.push(columns[0][fields.value]); }); } emit("confirm", { selectedValue: defaultValues.value, selectedOptions: selectedOptions.value }); }; const isSameValue = (valA, valB) => JSON.stringify(valA) === JSON.stringify(valB); watch( () => props.modelValue, (newValues) => { if (!isSameValue(newValues, defaultValues.value)) { defaultValues.value = newValues; } }, { deep: true, immediate: true } ); watch( defaultValues, (newValues) => { if (!isSameValue(newValues, props.modelValue)) { emit("update:modelValue", newValues); } }, { deep: true } ); watch( () => props.columns, (val) => { state.formattedColumns = val; } ); return __spreadProps(__spreadValues({}, toRefs(state)), { columnsType, columnsList, columnFieldNames, cancel, changeHandler, confirm, defaultValues, defaultIndexes, pickerColumn, swipeRef, selectedOptions, isSameValue }); }; const baseProps = { modelValue: { type: Array, default: () => [] }, title: { type: String, default: "" }, cancelText: { type: String, default: "" }, okText: { type: String, default: "" }, columns: { type: Array, default: () => { return []; } }, threeDimensional: { type: Boolean, default: false }, swipeDuration: { type: [Number, String], default: 1e3 }, showToolbar: { type: Boolean, default: true }, visibleOptionNum: { type: [Number, String], default: 7 }, optionHeight: { type: [Number, String], default: 36 }, fieldNames: { type: Object, default: () => ({}) }, disabled: { type: Boolean, default: false } }; const _hoisted_1 = { class: "ics-input-picker" }; const _hoisted_2 = { class: "nut-time-picker-content" }; const _hoisted_3 = { class: "nut-picker" }; const _hoisted_4 = { class: "nut-picker__bar" }; const _hoisted_5 = { class: "nut-picker__title" }; const _hoisted_6 = { class: "nut-picker__column__box" }; const _hoisted_7 = { class: "time-list-box" }; const _hoisted_8 = { class: "time-list" }; const _hoisted_9 = ["onClick"]; const _hoisted_10 = { class: "nut-time" }; const cN = "IcsPicker"; const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({}, { name: "IcsTimePicker" }), { __name: "index", props: baseProps, emits: ["cancel", "change", "confirm", "update:modelValue"], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emits = __emit; const translate = useLocale(cN); const show = ref(false); const pickerColumn = ref([]); const date = ref(""); const disabled = useFormDisabled(toRef(props, "disabled")); const timeList = ref([ { label: "03:00", value: "03:00" }, { label: "07:00", value: "07:00" }, { label: "11:00", value: "11:00" }, { label: "15:00", value: "15:00" }, { label: "19:00", value: "19:00" }, { label: "23:00", value: "23:00" } ]); const selectVal = computed({ get() { return props.modelValue.join(":"); }, set(value) { emits("update:modelValue", value); } }); const columnStyle = computed(() => { const styles = {}; styles.height = `${+props.visibleOptionNum * +props.optionHeight}px`; styles["--lineHeight"] = `${+props.optionHeight}px`; return styles; }); const currentTime = computed(() => selectVal.value); const { changeHandler, confirm, defaultValues, columnsList, columnsType, columnFieldNames, cancel } = usePicker( props, emits ); const swipeRef = (el) => { if (el && pickerColumn.value.length < columnsList.value.length) { pickerColumn.value.push(el); } }; const cancelHandler = () => { show.value = false; cancel(); }; const confirmHandler = () => { if (pickerColumn.value.length > 0) { pickerColumn.value.forEach((column) => { column.stopMomentum(); }); } show.value = false; confirm(); }; const onQuickTime = (item) => { emits("update:modelValue", item.value.split(":")); }; const onPicker = () => { if (disabled.value) return; show.value = true; selectVal.value && (date.value = selectVal.value); }; __expose({ columnsType, columnsList, columnFieldNames, cancel, changeHandler, confirmHandler, defaultValues, translate, pickerColumn, swipeRef, columnStyle }); return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [ createElementVNode("div", _hoisted_1, [ createVNode(unref(_sfc_main$1), { modelValue: selectVal.value, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectVal.value = $event), border: false, readonly: "", disabled: unref(disabled), placeholder: "请选择", onClick: onPicker }, null, 8, ["modelValue", "disabled"]) ]), createVNode(IcsPopup, { visible: show.value, "onUpdate:visible": _cache[1] || (_cache[1] = ($event) => show.value = $event), position: "bottom", "pop-class": "nut-time-picker-popup" }, { default: withCtx(() => [ createElementVNode("div", _hoisted_2, [ createElementVNode("div", _hoisted_3, [ createElementVNode("div", _hoisted_4, [ createElementVNode("div", { class: "nut-picker__left", onClick: cancelHandler }, toDisplayString(_ctx.cancelText || unref(translate)("cancel")), 1), createElementVNode("div", _hoisted_5, toDisplayString(_ctx.title), 1), createElementVNode("div", { class: "nut-picker__right", onClick: confirmHandler }, toDisplayString(_ctx.okText || unref(translate)("confirm")), 1) ]), renderSlot(_ctx.$slots, "top"), createElementVNode("div", _hoisted_6, [ createElementVNode("div", _hoisted_7, [ createElementVNode("div", _hoisted_8, [ (openBlock(true), createElementBlock(Fragment, null, renderList(timeList.value, (item) => { return openBlock(), createElementBlock("div", { key: item.value, class: normalizeClass(["nut-time__wrapper", { "nut-time__checked": currentTime.value == item.value }]), onClick: ($event) => onQuickTime(item) }, [ createElementVNode("div", _hoisted_10, toDisplayString(item.label), 1) ], 10, _hoisted_9); }), 128)) ]) ]), createElementVNode("div", { class: "nut-picker__column", style: normalizeStyle(columnStyle.value) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(columnsList), (column, columnIndex) => { return openBlock(), createElementBlock("div", { key: columnIndex, class: "nut-picker__columnitem" }, [ createVNode(IcsPickerColumn, { ref_for: true, ref: swipeRef, column, "columns-type": unref(columnsType), "field-names": unref(columnFieldNames), value: unref(defaultValues) && unref(defaultValues)[columnIndex], "three-dimensional": _ctx.threeDimensional, "swipe-duration": _ctx.swipeDuration, "visible-option-num": _ctx.visibleOptionNum, "option-height": _ctx.optionHeight, onChange: (option) => unref(changeHandler)(columnIndex, option) }, null, 8, ["column", "columns-type", "field-names", "value", "three-dimensional", "swipe-duration", "visible-option-num", "option-height", "onChange"]) ]); }), 128)) ], 4) ]), renderSlot(_ctx.$slots, "default") ]) ]) ]), _: 3 }, 8, ["visible"]) ], 64); }; } })); withInstall(_sfc_main); export { _sfc_main as TimePicker, _sfc_main as default };