123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import is, { hasProperty } from '@form-create/utils/lib/type'
- import { parseFn } from '@form-create/utils/lib/json'
- import toCase from '@form-create/utils/lib/tocase'
- import { computed, isRef, unref, ref } from 'vue'
- import ZhCn from '../lang/zh-cn'
- export function makeRequiredRule() {
- return {
- type: 'Required',
- field: 'formCreate$required',
- title: '是否必填'
- }
- }
- export function makeOptionsRule(t, to, flag) {
- const options = [
- { label: t('props.optionsType.json'), value: 0 },
- { label: t('props.optionsType.fetch'), value: 1 }
- ]
- const control = [
- {
- value: 0,
- rule: [
- {
- type: 'Struct',
- field: 'formCreate' + upper(to).replace('.', '>'),
- props: { defaultValue: [] }
- }
- ]
- },
- {
- value: 1,
- rule: [
- {
- type: 'Fetch',
- field: 'formCreateEffect>fetch',
- props: {
- to
- }
- }
- ]
- }
- ]
- if (flag !== false) {
- options.splice(0, 0, { label: t('props.optionsType.struct'), value: 2 })
- control.push({
- value: 2,
- rule: [
- {
- type: 'TableOptions',
- field: 'formCreate' + upper(to).replace('.', '>'),
- props: { defaultValue: [] }
- }
- ]
- })
- }
- return {
- type: 'radio',
- title: t('props.options'),
- field: '_optionType',
- value: flag !== false ? 2 : 0,
- options,
- props: {
- type: 'button'
- },
- control
- }
- }
- export function upper(str) {
- return str.replace(str[0], str[0].toLocaleUpperCase())
- }
- export const toJSON = function (val) {
- const type = /object ([a-zA-Z]*)/.exec(Object.prototype.toString.call(val))
- if (type && _toJSON[type[1].toLowerCase()]) {
- return _toJSON[type[1].toLowerCase()](val)
- } else {
- return val
- }
- }
- const _toJSON = {
- object: function (val) {
- const json = []
- for (const i in val) {
- if (!hasProperty(val, i)) continue
- json.push(toJSON(i) + ': ' + (val[i] != null ? toJSON(val[i]) : 'null'))
- }
- return '{\n ' + json.join(',\n ') + '\n}'
- },
- function: function (val) {
- val = '' + val
- const exec = /^ *([\w]+) *\(/.exec(val)
- if (exec && exec[1] !== 'function') {
- return 'function ' + val
- }
- return val
- },
- array: function (val) {
- for (var i = 0, json = []; i < val.length; i++) json[i] = val[i] != null ? toJSON(val[i]) : 'null'
- return '[' + json.join(', ') + ']'
- },
- string: function (val) {
- const tmp = val.split('')
- for (let i = 0; i < tmp.length; i++) {
- let c = tmp[i]
- c >= ' '
- ? c === '\\'
- ? (tmp[i] = '\\\\')
- : c === '"'
- ? (tmp[i] = '\\"')
- : 0
- : (tmp[i] =
- c === '\n'
- ? '\\n'
- : c === '\r'
- ? '\\r'
- : c === '\t'
- ? '\\t'
- : c === '\b'
- ? '\\b'
- : c === '\f'
- ? '\\f'
- : ((c = c.charCodeAt()), '\\u00' + (c > 15 ? 1 : 0) + (c % 16)))
- }
- return '"' + tmp.join('') + '"'
- }
- }
- export const deepParseFn = function (target) {
- if (target && typeof target === 'object') {
- for (const key in target) {
- if (Object.prototype.hasOwnProperty.call(target, key)) {
- const data = target[key]
- if (Array.isArray(data) || is.Object(data)) {
- deepParseFn(data)
- }
- if (is.String(data)) {
- target[key] = parseFn(data)
- }
- }
- }
- }
- return target
- }
- function get(object, path, defaultValue) {
- path = (path || '').split('.')
- let index = 0,
- length = path.length
- while (object != null && index < length) {
- object = object[path[index++]]
- }
- return index && index === length ? (object !== undefined ? object : defaultValue) : defaultValue
- }
- export const buildTranslator = locale => (path, option) => translate(path, option, unref(locale))
- export const translate = (path, option, locale) => get(locale, path, '').replace(/\{(\w+)\}/g, (_, key) => `${option?.[key] ?? `{${key}}`}`)
- export const buildLocaleContext = locale => {
- const lang = computed(() => unref(locale).name)
- const name = computed(() => upper(toCase(lang.value || '')))
- const localeRef = isRef(locale) ? locale : ref(locale)
- return {
- lang,
- name,
- locale: localeRef,
- t: buildTranslator(locale)
- }
- }
- export const useLocale = locale => {
- return buildLocaleContext(computed(() => locale.value || ZhCn))
- }
- export const localeProps = (t, prefix, rules) => {
- return rules.map(rule => {
- if (rule.field === 'formCreate$required') {
- rule.title = t('props.required') || rule.title
- } else if (rule.field && rule.field !== '_optionType') {
- rule.title = t('components.' + prefix + '.' + rule.field) || rule.title
- }
- return rule
- })
- }
|