@flyanra/vue-core 0.3.0 → 0.4.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.
Files changed (95) hide show
  1. package/dist/types/components/basic/typography/FlyCollapseTitleRenderer.vue.d.ts +16 -0
  2. package/dist/types/components/feedback/tooltip/FlyInfoTooltip.vue.d.ts +36 -0
  3. package/dist/types/components/feedback/tooltip/FlyTooltip.vue.d.ts +1 -0
  4. package/dist/types/components/form/form.utils.d.ts +10 -0
  5. package/dist/types/components/form/index.d.ts +1 -0
  6. package/dist/types/components/form/input-renderers/boolean/FlyBoolean.types.d.ts +14 -0
  7. package/dist/types/components/form/input-renderers/boolean/FlyBoolean.vue.d.ts +15 -0
  8. package/dist/types/components/form/input-renderers/date-time/FlyDateTime.types.d.ts +20 -0
  9. package/dist/types/components/form/input-renderers/date-time/FlyDateTime.vue.d.ts +19 -0
  10. package/dist/types/components/form/input-renderers/form-item-renderer/FlyFormItemRenderer.vue.d.ts +19 -0
  11. package/dist/types/components/form/input-renderers/form-schema-renderer/FlyFormSchemaRenderer.types.d.ts +2 -0
  12. package/dist/types/components/form/input-renderers/form-schema-renderer/FlyFormSchemaRenderer.utils.d.ts +23 -0
  13. package/dist/types/components/form/input-renderers/form-schema-renderer/FlyFormSchemaRenderer.vue.d.ts +17 -0
  14. package/dist/types/components/form/input-renderers/form-schema-renderer/UseFormSchemaRenderer.d.ts +25 -0
  15. package/dist/types/components/form/input-renderers/form-schema.types.d.ts +77 -0
  16. package/dist/types/components/form/input-renderers/input-renderer/FlyInputRenderer.vue.d.ts +18 -0
  17. package/dist/types/components/form/input-renderers/input-renderer.types.d.ts +30 -0
  18. package/dist/types/components/form/input-renderers/input-renderer.utils.d.ts +2 -0
  19. package/dist/types/components/form/input-renderers/number/FlyNumber.types.d.ts +13 -0
  20. package/dist/types/components/form/input-renderers/number/FlyNumber.utils.d.ts +1 -0
  21. package/dist/types/components/form/input-renderers/number/FlyNumber.vue.d.ts +19 -0
  22. package/dist/types/components/form/input-renderers/regional-tenant-form-renderer/FlyRegionalTenantFormRenderer.types.d.ts +13 -0
  23. package/dist/types/components/form/input-renderers/regional-tenant-form-renderer/FlyRegionalTenantFormRenderer.vue.d.ts +20 -0
  24. package/dist/types/components/form/input-renderers/select/FlySelect.types.d.ts +22 -0
  25. package/dist/types/components/form/input-renderers/select/FlySelect.utils.d.ts +2 -0
  26. package/dist/types/components/form/input-renderers/select/FlySelect.vue.d.ts +19 -0
  27. package/dist/types/components/form/input-renderers/text/FlyText.types.d.ts +18 -0
  28. package/dist/types/components/form/input-renderers/text/FlyText.vue.d.ts +19 -0
  29. package/dist/types/components/form/input-renderers/value-unit/FlyValueUnit.types.d.ts +23 -0
  30. package/dist/types/components/form/input-renderers/value-unit/FlyValueUnit.vue.d.ts +19 -0
  31. package/dist/types/components/form/input-validators.d.ts +13 -0
  32. package/dist/types/components/index.d.ts +0 -4
  33. package/dist/types/composables/UseLocaleInjector.d.ts +6 -0
  34. package/dist/types/utils/pure-functions.d.ts +1 -0
  35. package/dist/types/utils/validators.d.ts +9 -0
  36. package/package.json +18 -8
  37. package/src/components/basic/typography/FlyCollapseTitleRenderer.vue +46 -0
  38. package/src/components/feedback/tooltip/FlyInfoTooltip.vue +48 -0
  39. package/src/components/feedback/tooltip/FlyTooltip.element.scss +1 -1
  40. package/src/components/feedback/tooltip/FlyTooltip.vue +1 -0
  41. package/src/components/form/form.utils.ts +57 -0
  42. package/src/components/form/index.ts +0 -0
  43. package/src/components/form/input-renderers/boolean/FlyBoolean.scss +1 -0
  44. package/src/components/form/input-renderers/boolean/FlyBoolean.types.ts +16 -0
  45. package/src/components/form/input-renderers/boolean/FlyBoolean.vue +35 -0
  46. package/src/components/form/input-renderers/date-time/FlyDateTime.scss +1 -0
  47. package/src/components/form/input-renderers/date-time/FlyDateTime.types.ts +21 -0
  48. package/src/components/form/input-renderers/date-time/FlyDateTime.vue +85 -0
  49. package/src/components/form/input-renderers/form-item-renderer/FlyFormItemRenderer.scss +4 -0
  50. package/src/components/form/input-renderers/form-item-renderer/FlyFormItemRenderer.vue +48 -0
  51. package/src/components/form/input-renderers/form-schema-renderer/FlyFormSchemaRenderer.types.ts +3 -0
  52. package/src/components/form/input-renderers/form-schema-renderer/FlyFormSchemaRenderer.utils.ts +246 -0
  53. package/src/components/form/input-renderers/form-schema-renderer/FlyFormSchemaRenderer.vue +75 -0
  54. package/src/components/form/input-renderers/form-schema-renderer/UseFormSchemaRenderer.ts +97 -0
  55. package/src/components/form/input-renderers/form-schema.types.ts +95 -0
  56. package/src/components/form/input-renderers/input-renderer/FlyInputRenderer.vue +49 -0
  57. package/src/components/form/input-renderers/input-renderer.types.ts +49 -0
  58. package/src/components/form/input-renderers/input-renderer.utils.ts +18 -0
  59. package/src/components/form/input-renderers/number/FlyNumber.scss +1 -0
  60. package/src/components/form/input-renderers/number/FlyNumber.types.ts +13 -0
  61. package/src/components/form/input-renderers/number/FlyNumber.utils.ts +6 -0
  62. package/src/components/form/input-renderers/number/FlyNumber.vue +48 -0
  63. package/src/components/form/input-renderers/regional-tenant-form-renderer/FlyRegionalTenantFormRenderer.types.ts +15 -0
  64. package/src/components/form/input-renderers/regional-tenant-form-renderer/FlyRegionalTenantFormRenderer.vue +99 -0
  65. package/src/components/form/input-renderers/select/FlySelect.scss +1 -0
  66. package/src/components/form/input-renderers/select/FlySelect.types.ts +25 -0
  67. package/src/components/form/input-renderers/select/FlySelect.utils.ts +37 -0
  68. package/src/components/form/input-renderers/select/FlySelect.vue +48 -0
  69. package/src/components/form/input-renderers/text/FlyText.scss +1 -0
  70. package/src/components/form/input-renderers/text/FlyText.types.ts +20 -0
  71. package/src/components/form/input-renderers/text/FlyText.vue +56 -0
  72. package/src/components/form/input-renderers/value-unit/FlyValueUnit.scss +2 -0
  73. package/src/components/form/input-renderers/value-unit/FlyValueUnit.types.ts +28 -0
  74. package/src/components/form/input-renderers/value-unit/FlyValueUnit.vue +101 -0
  75. package/src/components/form/input-validators.ts +121 -0
  76. package/src/components/index.ts +0 -6
  77. package/src/styles/element/mixins/collapse.scss +2 -2
  78. package/src/styles/element/overrides/date-time.scss +11 -0
  79. package/src/styles/element/overrides/form.scss +9 -11
  80. package/src/styles/element/overrides/message-box.scss +2 -0
  81. package/src/styles/element/overrides/radio.scss +2 -0
  82. package/src/styles/element/overrides/select.scss +9 -0
  83. package/dist/types/components/AppButton/AppButton.types.d.ts +0 -8
  84. package/dist/types/components/AppButton/AppButton.vue.d.ts +0 -20
  85. package/dist/types/components/AppButton/index.d.ts +0 -4
  86. package/dist/types/components/AppCard/AppCard.types.d.ts +0 -5
  87. package/dist/types/components/AppCard/AppCard.vue.d.ts +0 -17
  88. package/dist/types/components/AppCard/index.d.ts +0 -4
  89. package/src/components/AppButton/AppButton.element.scss +0 -2
  90. package/src/components/AppButton/AppButton.types.ts +0 -10
  91. package/src/components/AppButton/AppButton.vue +0 -65
  92. package/src/components/AppButton/index.ts +0 -6
  93. package/src/components/AppCard/AppCard.types.ts +0 -5
  94. package/src/components/AppCard/AppCard.vue +0 -58
  95. package/src/components/AppCard/index.ts +0 -6
@@ -0,0 +1,15 @@
1
+ import type { T_FormSchemaLookupData, T_InputSchema } from '../form-schema.types'
2
+
3
+ export type T_TenantRegionalFormSection = {
4
+ key: string
5
+ fields: T_InputSchema[]
6
+ title: string
7
+ description?: string
8
+ lookupData?: T_FormSchemaLookupData
9
+ modelValue?: Record<string, unknown>
10
+ }
11
+
12
+ export type T_TenantRegionalFormProps = {
13
+ mainFormTitle: string
14
+ sections?: T_TenantRegionalFormSection[]
15
+ }
@@ -0,0 +1,99 @@
1
+ <template>
2
+ <div class="fly-regional-tenant-form-renderer">
3
+ <el-collapse v-if="sections?.length" v-model="activeNames" accordion>
4
+ <el-collapse-item :name="E_CollapsibleSections.mainForm">
5
+ <template #title>
6
+ <FlyCollapseTitleRenderer :title="mainFormTitle" />
7
+ </template>
8
+
9
+ <div style="padding: 1rem">
10
+ <slot></slot>
11
+ </div>
12
+ </el-collapse-item>
13
+
14
+ <template v-for="section in sections">
15
+ <el-collapse-item v-if="section.fields?.length" :key="section.key" :name="section.key">
16
+ <template #title>
17
+ <FlyCollapseTitleRenderer :title="section.title" />
18
+ </template>
19
+ <div style="padding: 1rem">
20
+ <div v-if="section.description" style="margin-bottom: 1.25rem">
21
+ <p style="font-size: 0.875; line-height: 1.25rem">
22
+ {{ t(section.description) }}
23
+ </p>
24
+ </div>
25
+
26
+ <FlyFormSchemaRenderer
27
+ :ref="(el) => setFormRef(el, section.key)"
28
+ v-model="section.modelValue"
29
+ :lookup-data="section.lookupData"
30
+ :form-config="section.fields"
31
+ :column-span="6"
32
+ />
33
+ </div>
34
+ </el-collapse-item>
35
+ </template>
36
+ </el-collapse>
37
+
38
+ <div v-else>
39
+ <slot></slot>
40
+ </div>
41
+ </div>
42
+ </template>
43
+
44
+ <script setup lang="ts">
45
+ import { type ComponentPublicInstance, reactive, ref } from 'vue'
46
+
47
+ import { ElCollapse, ElCollapseItem } from 'element-plus'
48
+
49
+ import { UseLocaleInjector } from '../../../../composables/UseLocaleInjector'
50
+ import '../../../../styles/element/overrides/collapse.scss'
51
+ import FlyCollapseTitleRenderer from '../../../basic/typography/FlyCollapseTitleRenderer.vue'
52
+ import type { T_FlyFormSchemaRendererInstance } from '../form-schema-renderer/FlyFormSchemaRenderer.types'
53
+ import FlyFormSchemaRenderer from '../form-schema-renderer/FlyFormSchemaRenderer.vue'
54
+
55
+ import type { T_TenantRegionalFormProps } from './FlyRegionalTenantFormRenderer.types'
56
+
57
+ enum E_CollapsibleSections {
58
+ mainForm
59
+ }
60
+
61
+ defineProps<T_TenantRegionalFormProps>()
62
+
63
+ const { t } = UseLocaleInjector()
64
+
65
+ const activeNames = ref<string | number>(E_CollapsibleSections.mainForm)
66
+ const formRefs = reactive<{ [K: string]: T_FlyFormSchemaRendererInstance }>({})
67
+
68
+ function setFormRef(formRef: Element | ComponentPublicInstance | null, key: string) {
69
+ if (formRef) {
70
+ formRefs[key] = formRef as T_FlyFormSchemaRendererInstance
71
+ }
72
+ }
73
+
74
+ async function validateForms() {
75
+ const keys = Object.keys(formRefs)
76
+ for (let index = 0; index < keys.length; index++) {
77
+ const element = formRefs[keys[index]]
78
+ const hasErrors = await element?.validateForm()
79
+ if (!hasErrors) continue
80
+ return hasErrors
81
+ }
82
+
83
+ return
84
+ }
85
+
86
+ defineExpose({
87
+ validateForms
88
+ })
89
+ </script>
90
+
91
+ <style lang="scss" scoped>
92
+ @use '../../../../styles/element/mixins/collapse.scss' as el-collapse-mixin;
93
+
94
+ .fly-regional-tenant-form-renderer {
95
+ :deep(.el-collapse) {
96
+ @include el-collapse-mixin.el-collapse-operation-style;
97
+ }
98
+ }
99
+ </style>
@@ -0,0 +1 @@
1
+ @use '../../../../styles/element/overrides/select.scss';
@@ -0,0 +1,25 @@
1
+ export type T_InputSelectValue = string | number | (string | number)[] | undefined
2
+
3
+ export type T_InputLabelValue = {
4
+ label: string
5
+ value: string | number
6
+ }
7
+ export type T_InputSelectOption = T_InputLabelValue | (number | string)
8
+ export type T_InputSelectOptionList = T_InputSelectOption[] | Record<string, T_InputLabelValue>
9
+
10
+ export type T_InputSelectBase = T_InputSelect & {
11
+ type: 'select'
12
+ }
13
+
14
+ export type T_InputSelect = {
15
+ placeholder?: string
16
+ /**
17
+ * Attrs are passed directly to the input element as props
18
+ */
19
+ attrs?: {
20
+ multiple?: boolean
21
+ }
22
+ config?: {
23
+ options: T_InputSelectOptionList
24
+ }
25
+ }
@@ -0,0 +1,37 @@
1
+ import { isArray, isObject } from 'lodash'
2
+
3
+ import type {
4
+ T_InputLabelValue,
5
+ T_InputSelectOption,
6
+ T_InputSelectOptionList
7
+ } from './FlySelect.types'
8
+
9
+ export function normalizeSelectOptionsToDict(
10
+ options: T_InputSelectOptionList
11
+ ): Record<string, T_InputLabelValue> {
12
+ // already a dict: Record<string, {label,value}>
13
+ if (!isArray(options)) {
14
+ const out: Record<string, T_InputLabelValue> = {}
15
+ Object.keys(options).forEach((k) => {
16
+ const item = options[k]
17
+ out[String(item.value)] = item
18
+ })
19
+ return out
20
+ }
21
+
22
+ // array: (string|number) OR {label,value}
23
+ const out: Record<string, T_InputLabelValue> = {}
24
+ options.forEach((opt: T_InputSelectOption) => {
25
+ if (isObject(opt)) {
26
+ const lv = opt as T_InputLabelValue
27
+ out[String(lv.value)] = lv
28
+ } else {
29
+ // primitive option => label=value
30
+ out[String(opt)] = {
31
+ label: String(opt),
32
+ value: opt
33
+ }
34
+ }
35
+ })
36
+ return out
37
+ }
@@ -0,0 +1,48 @@
1
+ <template>
2
+ <el-select
3
+ v-model="inputProxy"
4
+ style="width: 100%"
5
+ v-bind="input?.attrs"
6
+ filterable
7
+ :placeholder="input?.placeholder && input?.placeholder"
8
+ clearable
9
+ @change="(val) => emit('change', val)"
10
+ @blur="() => emit('blur')"
11
+ @focus="() => emit('focus')"
12
+ >
13
+ <el-option v-for="unit in options" :key="unit.value" :value="unit.value" :label="unit.label" />
14
+ </el-select>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { computed } from 'vue'
19
+
20
+ import { ElOption, ElSelect } from 'element-plus'
21
+
22
+ import './FlySelect.scss'
23
+ import type { T_InputSelect, T_InputSelectValue } from './FlySelect.types'
24
+ import { normalizeSelectOptionsToDict } from './FlySelect.utils'
25
+
26
+ const emit = defineEmits<{
27
+ (e: 'update:modelValue', v: T_InputSelectValue): void
28
+ (e: 'change', v: T_InputSelectValue): void
29
+ (e: 'blur'): void
30
+ (e: 'focus'): void
31
+ }>()
32
+
33
+ const props = defineProps<{
34
+ modelValue?: T_InputSelectValue
35
+ input?: T_InputSelect
36
+ }>()
37
+
38
+ const options = computed(() => normalizeSelectOptionsToDict(props.input?.config?.options || []))
39
+
40
+ const inputProxy = computed({
41
+ get: () => {
42
+ return props.modelValue
43
+ },
44
+ set: (v) => {
45
+ emit('update:modelValue', v)
46
+ }
47
+ })
48
+ </script>
@@ -0,0 +1 @@
1
+ @use 'element-plus/theme-chalk/src/input.scss';
@@ -0,0 +1,20 @@
1
+ export type T_InputTextValues = string | number | undefined
2
+
3
+ export type T_InputTextBase = T_InputText & {
4
+ type: 'text' | 'textarea'
5
+ }
6
+
7
+ export type T_InputText = {
8
+ placeholder?: string
9
+ /**
10
+ * Attrs are passed directly to the input element as props
11
+ */
12
+ attrs?: {
13
+ minlength?: number
14
+ maxlength?: number
15
+ showWordLimit?: boolean
16
+ type?: string
17
+ rows?: number
18
+ }
19
+ mask?: string // example ###-###.@ - uses Maska: https://github.com/beholdr/maska
20
+ }
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <el-input
3
+ v-model="inputProxy"
4
+ v-maska="inputType === 'text' ? input?.mask : undefined"
5
+ style="width: 100%"
6
+ :type="inputType"
7
+ v-bind="input?.attrs"
8
+ :placeholder="input?.placeholder"
9
+ show-word-limit
10
+ @change="(val) => emit('change', castValue(val))"
11
+ @blur="() => emit('blur')"
12
+ @focus="() => emit('focus')"
13
+ >
14
+ </el-input>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { computed } from 'vue'
19
+
20
+ import { ElInput } from 'element-plus'
21
+
22
+ import { vMaska } from 'maska/vue'
23
+
24
+ import { getInputDisplayValue } from '../input-renderer.utils'
25
+
26
+ import './FlyText.scss'
27
+ import type { T_InputText, T_InputTextValues } from './FlyText.types'
28
+
29
+ const emit = defineEmits<{
30
+ (e: 'update:modelValue', v: T_InputTextValues): void
31
+ (e: 'change', v: T_InputTextValues): void
32
+ (e: 'blur'): void
33
+ (e: 'focus'): void
34
+ }>()
35
+
36
+ const props = defineProps<{
37
+ modelValue?: T_InputTextValues
38
+ input?: T_InputText
39
+ }>()
40
+
41
+ const inputType = computed(() => props.input?.attrs?.type || 'text')
42
+
43
+ const inputProxy = computed({
44
+ get: () => {
45
+ return getInputDisplayValue(props.modelValue, 'text')
46
+ },
47
+ set: (v) => {
48
+ const parsed = castValue(v)
49
+ emit('update:modelValue', parsed)
50
+ }
51
+ })
52
+
53
+ function castValue(v: unknown) {
54
+ return v ? String(v) : ''
55
+ }
56
+ </script>
@@ -0,0 +1,2 @@
1
+ @use '../text/FlyText.scss';
2
+ @use '../select/FlySelect.scss';
@@ -0,0 +1,28 @@
1
+ import type { T_InputNumber } from '../number/FlyNumber.types'
2
+ import type { T_InputSelect, T_InputSelectOptionList } from '../select/FlySelect.types'
3
+ import type { T_InputText } from '../text/FlyText.types'
4
+
5
+ export type T_ValueUnitValue =
6
+ | {
7
+ unit: string | number | undefined
8
+ value: string | number | undefined
9
+ }
10
+ | undefined
11
+
12
+ export type T_InputValueUnitBase = T_InputValueUnit & {
13
+ type: 'valueUnit'
14
+ }
15
+
16
+ export type T_InputValueUnit = {
17
+ placeholder?: string
18
+ unitPlaceholder?: string
19
+ /**
20
+ * Attrs are passed directly to the input element as props
21
+ */
22
+ attrs?: T_InputText['attrs'] | T_InputNumber['attrs']
23
+ unitsAttr?: T_InputSelect['attrs']
24
+ config?: {
25
+ valueType?: 'text' | 'number' // defaults to number
26
+ options: T_InputSelectOptionList
27
+ }
28
+ }
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <el-input
3
+ v-model="valueProxy"
4
+ style="width: 100%"
5
+ :type="valueTypeIsString ? 'text' : 'number'"
6
+ v-bind="input?.attrs"
7
+ :placeholder="input?.placeholder"
8
+ @change="(v) => emit('change', getValue(v))"
9
+ @blur="() => emit('blur')"
10
+ @focus="() => emit('focus')"
11
+ >
12
+ <template #append>
13
+ <el-select
14
+ v-bind="input?.unitsAttr"
15
+ v-model="unitProxy"
16
+ style="width: 100px"
17
+ filterable
18
+ :placeholder="input?.unitPlaceholder"
19
+ @change="(v) => emit('change', getUnit(v))"
20
+ @blur="() => emit('blur')"
21
+ @focus="() => emit('focus')"
22
+ >
23
+ <el-option
24
+ v-for="unit in options"
25
+ :key="unit.value"
26
+ :value="unit.value"
27
+ :label="unit.label"
28
+ />
29
+ </el-select>
30
+ </template>
31
+ </el-input>
32
+ </template>
33
+
34
+ <script setup lang="ts">
35
+ import { computed } from 'vue'
36
+
37
+ import { ElInput, ElOption, ElSelect } from 'element-plus'
38
+
39
+ import { getInputDisplayValue } from '../input-renderer.utils'
40
+ import { displayToNumber } from '../number/FlyNumber.utils'
41
+ import { normalizeSelectOptionsToDict } from '../select/FlySelect.utils'
42
+
43
+ import './FlyValueUnit.scss'
44
+ import type { T_InputValueUnit, T_ValueUnitValue } from './FlyValueUnit.types'
45
+
46
+ const emit = defineEmits<{
47
+ (e: 'update:modelValue', v: T_ValueUnitValue): void
48
+ (e: 'change', v: T_ValueUnitValue): void
49
+ (e: 'blur'): void
50
+ (e: 'focus'): void
51
+ }>()
52
+
53
+ const props = defineProps<{
54
+ modelValue?: T_ValueUnitValue
55
+ input?: T_InputValueUnit
56
+ }>()
57
+
58
+ const options = computed(() => normalizeSelectOptionsToDict(props.input?.config?.options || []))
59
+
60
+ const valueTypeIsString = computed(() => props.input?.config?.valueType === 'text')
61
+
62
+ const valueProxy = computed<string>({
63
+ get: () => {
64
+ return getInputDisplayValue(
65
+ props.modelValue?.value,
66
+ valueTypeIsString.value ? 'text' : 'number'
67
+ )
68
+ },
69
+ set: (v) => {
70
+ emit('update:modelValue', getValue(v))
71
+ }
72
+ })
73
+
74
+ const unitProxy = computed({
75
+ get: () => props.modelValue?.unit ?? undefined,
76
+ set: (u) => {
77
+ emit('update:modelValue', getUnit(u))
78
+ }
79
+ })
80
+
81
+ function ensure(): NonNullable<T_ValueUnitValue> {
82
+ return {
83
+ value: props.modelValue?.value ?? undefined,
84
+ unit: props.modelValue?.unit ?? undefined
85
+ }
86
+ }
87
+
88
+ function getValue(v: string) {
89
+ const base = ensure()
90
+ const parsed = valueTypeIsString.value ? v : displayToNumber(v)
91
+
92
+ const next = { ...base, value: parsed }
93
+ return next
94
+ }
95
+
96
+ function getUnit(u: NonNullable<T_ValueUnitValue>['unit']) {
97
+ const base = ensure()
98
+ const next = { ...base, unit: u }
99
+ return next
100
+ }
101
+ </script>
@@ -0,0 +1,121 @@
1
+ import type { FormItemRule } from 'element-plus'
2
+
3
+ import { isNil } from 'lodash'
4
+ import type { Composer } from 'vue-i18n'
5
+
6
+ import { type checkInputRange, isRequiredError } from '../../utils/validators'
7
+
8
+ import type { T_ValueUnitValue } from './input-renderers/value-unit/FlyValueUnit.types'
9
+
10
+ type InputTriggers = 'blur' | 'change'
11
+
12
+ // type Validator = (
13
+ // languageKey?: string,
14
+ // trigger?: InputTriggers,
15
+ // useRequiredMessage?: boolean,
16
+ // required?: boolean,
17
+ // options?: {
18
+ // valueType?: 'text' | 'number'
19
+ // },
20
+ // composer?: Composer
21
+ // ) => FormItemRule
22
+
23
+ export const requiredField = (
24
+ fieldLabel = 'validation.field',
25
+ trigger: InputTriggers = 'blur',
26
+ useRequiredMessage = true,
27
+ composer?: Composer
28
+ ): FormItemRule => {
29
+ return {
30
+ required: true,
31
+ trigger: trigger,
32
+ message: useRequiredMessage ? isRequiredError(fieldLabel, composer) : fieldLabel
33
+ }
34
+ }
35
+
36
+ export const checkInputRangeValidator = (
37
+ validator: ReturnType<typeof checkInputRange>,
38
+ trigger: InputTriggers = 'change'
39
+ ): FormItemRule => ({
40
+ trigger: trigger,
41
+ validator
42
+ })
43
+
44
+ export const requiredFieldNumber = (
45
+ languageKey = 'validation.field',
46
+ trigger: InputTriggers = 'change',
47
+ composer?: Composer
48
+ ): FormItemRule => {
49
+ const t = composer?.t
50
+ return {
51
+ type: 'number',
52
+ required: true,
53
+ trigger: trigger,
54
+ message: t
55
+ ? t('validation.fieldMustBeANumber', {
56
+ fieldName: t(languageKey)
57
+ })
58
+ : 'validation.fieldMustBeANumber'
59
+ }
60
+ }
61
+
62
+ export const requiredFieldNumberSelect = (
63
+ label = 'validation.field',
64
+ trigger: InputTriggers = 'blur',
65
+ useRequiredMessage = true,
66
+ composer?: Composer
67
+ ): FormItemRule =>
68
+ requiredFieldValueUnit(
69
+ label,
70
+ trigger,
71
+ useRequiredMessage,
72
+ true,
73
+ {
74
+ valueType: 'number'
75
+ },
76
+ composer
77
+ )
78
+
79
+ export const requiredFieldValueUnit = (
80
+ label = 'validation.field',
81
+ trigger: InputTriggers = 'blur',
82
+ useRequiredMessage = true,
83
+ required = true,
84
+ options: {
85
+ valueType?: 'text' | 'number'
86
+ },
87
+ composer?: Composer
88
+ ): FormItemRule => ({
89
+ required: required,
90
+ trigger: trigger,
91
+ validator: (_rule, value: T_ValueUnitValue, callback) => {
92
+ // used in element form validator
93
+ if (
94
+ (options?.valueType === 'number' &&
95
+ !(
96
+ value &&
97
+ value.unit !== '' &&
98
+ value.value !== '' &&
99
+ !isNil(value.unit) &&
100
+ !isNil(value.value)
101
+ )) ||
102
+ !value
103
+ ) {
104
+ return callback(new Error(useRequiredMessage ? isRequiredError(label, composer) : label))
105
+ }
106
+
107
+ return callback()
108
+ }
109
+ })
110
+
111
+ export const requiredFieldArray = (
112
+ label = 'validation.field',
113
+ trigger: InputTriggers = 'change',
114
+ useRequiredMessage = true,
115
+ composer?: Composer
116
+ ): FormItemRule => ({
117
+ type: 'array',
118
+ required: true,
119
+ trigger: trigger,
120
+ message: useRequiredMessage ? isRequiredError(label, composer) : label
121
+ })
@@ -1,9 +1,3 @@
1
- export { default as AppButton } from './AppButton'
2
- export type * from './AppButton'
3
-
4
- export { default as AppCard } from './AppCard'
5
- export type * from './AppCard'
6
-
7
1
  export * from './navigation'
8
2
 
9
3
  export * from './basic'
@@ -1,7 +1,7 @@
1
1
  @mixin el-collapse-operation-style {
2
2
  .el-collapse-item {
3
3
  &__header {
4
- padding: 0.5rem 0rem 0.5rem 0rem;
4
+ padding: 0.5rem 0.5rem 0.5rem 0rem;
5
5
  min-height: 48px;
6
6
  text-align: left;
7
7
  }
@@ -38,7 +38,7 @@
38
38
  .el-collapse-item {
39
39
  border-bottom: 10px solid transparent;
40
40
  &__header {
41
- padding: 0.25rem 0rem 0.25rem 0rem;
41
+ padding: 0.25rem 0.5rem 0.25rem 0rem;
42
42
  // min-height: 30px;
43
43
  text-align: left;
44
44
  border-top: 1px solid var(--el-collapse-border-color);
@@ -0,0 +1,11 @@
1
+ @use 'element-plus/theme-chalk/src/input.scss';
2
+ @use 'element-plus/theme-chalk/src/button.scss';
3
+ @use 'element-plus/theme-chalk/src/icon.scss';
4
+
5
+ @use 'element-plus/theme-chalk/src/date-picker.scss';
6
+ @use 'element-plus/theme-chalk/src/date-picker-panel.scss';
7
+ @use 'element-plus/theme-chalk/src/time-picker.scss';
8
+ @use 'element-plus/theme-chalk/src/time-select.scss';
9
+
10
+ @use 'element-plus/theme-chalk/src/popper.scss';
11
+ @use 'element-plus/theme-chalk/src/scrollbar.scss';
@@ -1,14 +1,12 @@
1
- @use 'element-plus/theme-chalk/src/form.scss' as *;
2
- @use 'element-plus/theme-chalk/src/form-item.scss' as *;
3
- @use 'element-plus/theme-chalk/src/input.scss' as *;
4
- @use 'element-plus/theme-chalk/src/input-number.scss' as *;
5
- @use 'element-plus/theme-chalk/src/option.scss' as *;
6
- @use 'element-plus/theme-chalk/src/select.scss' as *;
7
- @use 'element-plus/theme-chalk/src/radio.scss' as *;
8
- @use 'element-plus/theme-chalk/src/radio-group.scss' as *;
9
- @use 'element-plus/theme-chalk/src/checkbox.scss' as *;
10
- @use 'element-plus/theme-chalk/src/date-picker.scss' as *;
11
- @use 'element-plus/theme-chalk/src/switch.scss' as *;
1
+ @use 'element-plus/theme-chalk/src/form.scss';
2
+ @use 'element-plus/theme-chalk/src/form-item.scss';
3
+ @use 'element-plus/theme-chalk/src/input.scss';
4
+ @use 'element-plus/theme-chalk/src/input-number.scss';
5
+ @use './select.scss';
6
+ @use './radio.scss';
7
+ @use 'element-plus/theme-chalk/src/checkbox.scss';
8
+ @use './date-time.scss';
9
+ @use 'element-plus/theme-chalk/src/switch.scss';
12
10
 
13
11
  .el-form-item {
14
12
  &__error,
@@ -0,0 +1,2 @@
1
+ @use 'element-plus/theme-chalk/src/overlay.scss' as *;
2
+ @use 'element-plus/theme-chalk/src/message-box.scss' as *;
@@ -0,0 +1,2 @@
1
+ @use 'element-plus/theme-chalk/src/radio.scss';
2
+ @use 'element-plus/theme-chalk/src/radio-group.scss';
@@ -0,0 +1,9 @@
1
+ @use 'element-plus/theme-chalk/src/select.scss';
2
+ @use 'element-plus/theme-chalk/src/option.scss';
3
+
4
+ @use 'element-plus/theme-chalk/src/input.scss';
5
+ @use 'element-plus/theme-chalk/src/tag.scss';
6
+
7
+ @use 'element-plus/theme-chalk/src/popper.scss';
8
+ @use 'element-plus/theme-chalk/src/scrollbar.scss';
9
+ @use 'element-plus/theme-chalk/src/icon.scss';
@@ -1,8 +0,0 @@
1
- export type AppButtonVariant = 'primary' | 'secondary' | 'ghost';
2
- export type AppButtonSize = 'sm' | 'md' | 'lg';
3
- export interface AppButtonProps {
4
- disabled?: boolean;
5
- label?: string;
6
- size?: AppButtonSize;
7
- variant?: AppButtonVariant;
8
- }