firstly 0.2.1 → 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.
- package/CHANGELOG.md +65 -0
- package/esm/SqlDatabase/FF_LogToConsole.js +9 -14
- package/esm/carbone/CarboneController.js +2 -1
- package/esm/changeLog/index.d.ts +0 -10
- package/esm/{internals → core}/BaseEnum.d.ts +1 -1
- package/esm/core/FF_Entity.js +5 -0
- package/esm/core/helper.d.ts +2 -0
- package/esm/core/helper.js +3 -0
- package/esm/core/index.d.ts +0 -0
- package/esm/core/index.js +5 -0
- package/esm/core/tailwind.d.ts +21 -0
- package/esm/core/tailwind.js +22 -0
- package/esm/core/tryCatch.d.ts +44 -0
- package/esm/core/tryCatch.js +34 -0
- package/esm/cron/server/index.js +1 -1
- package/esm/feedback/FeedbackController.js +3 -2
- package/esm/feedback/index.d.ts +7 -2
- package/esm/feedback/index.js +1 -2
- package/esm/feedback/server/index.d.ts +0 -5
- package/esm/feedback/server/index.js +1 -1
- package/esm/formats/strings.js +2 -2
- package/esm/index.d.ts +16 -0
- package/esm/index.js +13 -0
- package/esm/svelte/FF_Repo.svelte.d.ts +9 -2
- package/esm/svelte/FF_Repo.svelte.js +40 -17
- package/esm/svelte/class/SP.svelte.js +14 -2
- package/esm/svelte/helpers/debounce.js +1 -1
- package/esm/svelte/index.d.ts +2 -24
- package/esm/svelte/index.js +2 -22
- package/esm/{ui → svelte/ui}/Icon.svelte +1 -1
- package/esm/virtual/StateDemoEnum.d.ts +3 -3
- package/esm/virtual/StateDemoEnum.js +3 -3
- package/esm/virtual/UIEntity.js +1 -2
- package/package.json +8 -39
- package/esm/auth/AuthController.d.ts +0 -58
- package/esm/auth/AuthController.js +0 -114
- package/esm/auth/Entities.d.ts +0 -47
- package/esm/auth/Entities.js +0 -182
- package/esm/auth/README.md +0 -3
- package/esm/auth/index.d.ts +0 -5
- package/esm/auth/index.js +0 -5
- package/esm/auth/server/AuthController.server.d.ts +0 -58
- package/esm/auth/server/AuthController.server.js +0 -518
- package/esm/auth/server/handleAuth.d.ts +0 -4
- package/esm/auth/server/handleAuth.js +0 -142
- package/esm/auth/server/handleGuard.d.ts +0 -22
- package/esm/auth/server/handleGuard.js +0 -34
- package/esm/auth/server/helperDb.d.ts +0 -10
- package/esm/auth/server/helperDb.js +0 -56
- package/esm/auth/server/helperFirstly.d.ts +0 -1
- package/esm/auth/server/helperFirstly.js +0 -9
- package/esm/auth/server/helperOslo.d.ts +0 -7
- package/esm/auth/server/helperOslo.js +0 -24
- package/esm/auth/server/helperRemultServer.d.ts +0 -5
- package/esm/auth/server/helperRemultServer.js +0 -44
- package/esm/auth/server/helperRole.d.ts +0 -19
- package/esm/auth/server/helperRole.js +0 -57
- package/esm/auth/server/index.d.ts +0 -8
- package/esm/auth/server/index.js +0 -8
- package/esm/auth/server/module.d.ts +0 -300
- package/esm/auth/server/module.js +0 -230
- package/esm/auth/server/providers/github.d.ts +0 -33
- package/esm/auth/server/providers/github.js +0 -87
- package/esm/auth/server/providers/helperProvider.d.ts +0 -1
- package/esm/auth/server/providers/helperProvider.js +0 -25
- package/esm/auth/static/assets/Page-BHW08QWz.css +0 -1
- package/esm/auth/static/assets/Page-BRNWcY5Z.d.ts +0 -2
- package/esm/auth/static/assets/Page-BRNWcY5Z.js +0 -1
- package/esm/auth/static/assets/Page-CFcEsGK8.d.ts +0 -2
- package/esm/auth/static/assets/Page-CFcEsGK8.js +0 -7
- package/esm/auth/static/assets/Page-tLVs5slF.d.ts +0 -2
- package/esm/auth/static/assets/Page-tLVs5slF.js +0 -1
- package/esm/auth/static/assets/index-D38rqu4x.d.ts +0 -201
- package/esm/auth/static/assets/index-D38rqu4x.js +0 -2
- package/esm/auth/static/assets/index-DKWpA6v7.css +0 -4
- package/esm/auth/static/favicon.svg +0 -79
- package/esm/auth/static/index.html +0 -13
- package/esm/auth/types.d.ts +0 -73
- package/esm/bin/cmd.d.ts +0 -1
- package/esm/bin/cmd.js +0 -793
- package/esm/feedback/ui/DialogIssue.svelte +0 -149
- package/esm/feedback/ui/DialogIssue.svelte.d.ts +0 -22
- package/esm/feedback/ui/DialogIssues.svelte +0 -114
- package/esm/feedback/ui/DialogIssues.svelte.d.ts +0 -22
- package/esm/feedback/ui/DialogMilestones.svelte +0 -43
- package/esm/feedback/ui/DialogMilestones.svelte.d.ts +0 -20
- package/esm/feedback/ui/Feedback.svelte +0 -16
- package/esm/feedback/ui/Feedback.svelte.d.ts +0 -18
- package/esm/internals/FF_Entity.d.ts +0 -2
- package/esm/internals/FF_Entity.js +0 -21
- package/esm/internals/FF_Fields.d.ts +0 -11
- package/esm/internals/FF_Fields.js +0 -144
- package/esm/internals/cellsBuildor.d.ts +0 -47
- package/esm/internals/cellsBuildor.js +0 -140
- package/esm/internals/helper.d.ts +0 -49
- package/esm/internals/helper.js +0 -162
- package/esm/internals/index.d.ts +0 -82
- package/esm/internals/index.js +0 -45
- package/esm/internals/storeItem.d.ts +0 -28
- package/esm/internals/storeItem.js +0 -176
- package/esm/internals/storeList.d.ts +0 -34
- package/esm/internals/storeList.js +0 -108
- package/esm/internals/theme.d.ts +0 -4
- package/esm/internals/theme.js +0 -4
- package/esm/server/index.d.ts +0 -52
- package/esm/server/index.js +0 -87
- package/esm/svelte/FF_Cell.svelte +0 -103
- package/esm/svelte/FF_Cell.svelte.d.ts +0 -33
- package/esm/svelte/FF_Cell_Caption.svelte +0 -20
- package/esm/svelte/FF_Cell_Caption.svelte.d.ts +0 -31
- package/esm/svelte/FF_Cell_Display.svelte +0 -61
- package/esm/svelte/FF_Cell_Display.svelte.d.ts +0 -29
- package/esm/svelte/FF_Cell_Edit.svelte +0 -104
- package/esm/svelte/FF_Cell_Edit.svelte.d.ts +0 -32
- package/esm/svelte/FF_Cell_Error.svelte +0 -20
- package/esm/svelte/FF_Cell_Error.svelte.d.ts +0 -31
- package/esm/svelte/FF_Cell_Hint.svelte +0 -20
- package/esm/svelte/FF_Cell_Hint.svelte.d.ts +0 -31
- package/esm/svelte/FF_Config.svelte +0 -29
- package/esm/svelte/FF_Config.svelte.d.ts +0 -9
- package/esm/svelte/FF_Form.svelte +0 -155
- package/esm/svelte/FF_Form.svelte.d.ts +0 -37
- package/esm/svelte/FF_Grid.svelte +0 -257
- package/esm/svelte/FF_Grid.svelte.d.ts +0 -37
- package/esm/svelte/FF_Layout.svelte +0 -62
- package/esm/svelte/FF_Layout.svelte.d.ts +0 -31
- package/esm/svelte/actions/intersection.d.ts +0 -6
- package/esm/svelte/actions/intersection.js +0 -17
- package/esm/svelte/customField.d.ts +0 -69
- package/esm/svelte/customField.js +0 -4
- package/esm/svelte/dialog/DialogManagement.svelte +0 -98
- package/esm/svelte/dialog/DialogManagement.svelte.d.ts +0 -18
- package/esm/svelte/dialog/DialogPrimitive.svelte +0 -156
- package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +0 -38
- package/esm/svelte/dialog/dialog.d.ts +0 -58
- package/esm/svelte/dialog/dialog.js +0 -130
- package/esm/svelte/ff_Config.svelte.d.ts +0 -91
- package/esm/svelte/ff_Config.svelte.js +0 -111
- package/esm/svelte/firstly.css +0 -14
- package/esm/svelte/helpers.d.ts +0 -30
- package/esm/svelte/helpers.js +0 -38
- package/esm/svelte/tryCatch.d.ts +0 -12
- package/esm/svelte/tryCatch.js +0 -18
- package/esm/sveltekit/server/index.d.ts +0 -5
- package/esm/sveltekit/server/index.js +0 -24
- package/esm/ui/Button.svelte +0 -138
- package/esm/ui/Button.svelte.d.ts +0 -13
- package/esm/ui/Clipboardable.svelte +0 -25
- package/esm/ui/Clipboardable.svelte.d.ts +0 -12
- package/esm/ui/Field.svelte +0 -382
- package/esm/ui/Field.svelte.d.ts +0 -40
- package/esm/ui/FieldGroup.svelte +0 -117
- package/esm/ui/FieldGroup.svelte.d.ts +0 -44
- package/esm/ui/Grid.svelte +0 -265
- package/esm/ui/Grid.svelte.d.ts +0 -57
- package/esm/ui/Grid2.svelte +0 -293
- package/esm/ui/Grid2.svelte.d.ts +0 -57
- package/esm/ui/GridLoading.svelte +0 -58
- package/esm/ui/GridLoading.svelte.d.ts +0 -23
- package/esm/ui/GridPaginate.svelte +0 -69
- package/esm/ui/GridPaginate.svelte.d.ts +0 -23
- package/esm/ui/GridPaginate2.svelte +0 -25
- package/esm/ui/GridPaginate2.svelte.d.ts +0 -7
- package/esm/ui/Loading.svelte +0 -16
- package/esm/ui/Loading.svelte.d.ts +0 -31
- package/esm/ui/Tooltip.svelte +0 -45
- package/esm/ui/Tooltip.svelte.d.ts +0 -32
- package/esm/ui/dialog/DialogForm.svelte +0 -76
- package/esm/ui/dialog/DialogForm.svelte.d.ts +0 -21
- package/esm/ui/dialog/DialogManagement.svelte +0 -96
- package/esm/ui/dialog/DialogManagement.svelte.d.ts +0 -26
- package/esm/ui/dialog/DialogPrimitive.svelte +0 -90
- package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +0 -38
- package/esm/ui/dialog/FormEditAction.svelte +0 -62
- package/esm/ui/dialog/FormEditAction.svelte.d.ts +0 -31
- package/esm/ui/dialog/dialog.d.ts +0 -60
- package/esm/ui/dialog/dialog.js +0 -100
- package/esm/ui/index.d.ts +0 -6
- package/esm/ui/index.js +0 -20
- package/esm/ui/internals/FieldContainer.svelte +0 -39
- package/esm/ui/internals/FieldContainer.svelte.d.ts +0 -18
- package/esm/ui/internals/Input.svelte +0 -143
- package/esm/ui/internals/Input.svelte.d.ts +0 -37
- package/esm/ui/internals/Textarea.svelte +0 -66
- package/esm/ui/internals/Textarea.svelte.d.ts +0 -33
- package/esm/ui/internals/select/MultiSelectMelt.svelte +0 -260
- package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +0 -32
- package/esm/ui/internals/select/Select2.svelte +0 -88
- package/esm/ui/internals/select/Select2.svelte.d.ts +0 -12
- package/esm/ui/internals/select/SelectMelt.svelte +0 -280
- package/esm/ui/internals/select/SelectMelt.svelte.d.ts +0 -40
- package/esm/ui/internals/select/SelectRadio.svelte +0 -43
- package/esm/ui/internals/select/SelectRadio.svelte.d.ts +0 -27
- package/esm/ui/link/Link.svelte +0 -33
- package/esm/ui/link/Link.svelte.d.ts +0 -33
- package/esm/ui/link/LinkPlus.svelte +0 -63
- package/esm/ui/link/LinkPlus.svelte.d.ts +0 -9
- package/esm/utils/tailwind.d.ts +0 -2
- package/esm/utils/tailwind.js +0 -3
- package/esm/utils/transition.d.ts +0 -9
- package/esm/utils/transition.js +0 -33
- package/esm/utils/types.js +0 -1
- /package/esm/{internals → core}/BaseEnum.js +0 -0
- /package/esm/{internals → core}/common.d.ts +0 -0
- /package/esm/{internals → core}/common.js +0 -0
- /package/esm/{utils → core}/types.d.ts +0 -0
- /package/esm/{auth → core}/types.js +0 -0
- /package/esm/{ui → svelte/ui}/Icon.svelte.d.ts +0 -0
- /package/esm/{ui → svelte/ui}/LibIcon.d.ts +0 -0
- /package/esm/{ui → svelte/ui}/LibIcon.js +0 -0
package/esm/ui/Field.svelte
DELETED
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
<script lang="ts" generics="T extends Record<any, any>">
|
|
2
|
-
import { createEventDispatcher } from 'svelte'
|
|
3
|
-
import type { HTMLInputAttributes } from 'svelte/elements'
|
|
4
|
-
|
|
5
|
-
import { type FieldMetadata, type FindOptions } from 'remult'
|
|
6
|
-
import { midTrim } from '@kitql/helpers'
|
|
7
|
-
|
|
8
|
-
import { suffixWithS } from '../formats/strings'
|
|
9
|
-
import { type BaseItem, type Cell } from '../internals'
|
|
10
|
-
import {
|
|
11
|
-
displayWithDefaultAndSuffix,
|
|
12
|
-
getEntityDisplayValue,
|
|
13
|
-
getFieldMetaType,
|
|
14
|
-
getFirstInterestingField,
|
|
15
|
-
type MetaTypeRelation,
|
|
16
|
-
} from '../internals/helper.js'
|
|
17
|
-
import { tw } from '../utils/tailwind'
|
|
18
|
-
import Clipboardable from './Clipboardable.svelte'
|
|
19
|
-
import Icon from './Icon.svelte'
|
|
20
|
-
import FieldContainer from './internals/FieldContainer.svelte'
|
|
21
|
-
import Input from './internals/Input.svelte'
|
|
22
|
-
import MultiSelectMelt from './internals/select/MultiSelectMelt.svelte'
|
|
23
|
-
import SelectMelt from './internals/select/SelectMelt.svelte'
|
|
24
|
-
import SelectRadio from './internals/select/SelectRadio.svelte'
|
|
25
|
-
import Textarea from './internals/Textarea.svelte'
|
|
26
|
-
import { LibIcon_Eye, LibIcon_EyeOff } from './LibIcon'
|
|
27
|
-
import Link from './link/Link.svelte'
|
|
28
|
-
import LinkPlus from './link/LinkPlus.svelte'
|
|
29
|
-
|
|
30
|
-
// import Select2 from './internals/select/Select2.svelte'
|
|
31
|
-
|
|
32
|
-
export let cell: Cell<T>
|
|
33
|
-
export let value: HTMLInputAttributes['value'] = undefined
|
|
34
|
-
|
|
35
|
-
// values of other fields in same context e.g. in form
|
|
36
|
-
export let cellsValues: any = {}
|
|
37
|
-
|
|
38
|
-
export let withDedounce: boolean = false
|
|
39
|
-
|
|
40
|
-
export let error = ''
|
|
41
|
-
|
|
42
|
-
export let mode: 'edit' | 'view' | 'filtre' = 'edit'
|
|
43
|
-
|
|
44
|
-
export let focus: boolean = false
|
|
45
|
-
|
|
46
|
-
export let clearable: boolean | undefined = undefined
|
|
47
|
-
export let disabled = false
|
|
48
|
-
export let createRequest: ((args: { input: string; id: string }) => void) | undefined = undefined
|
|
49
|
-
|
|
50
|
-
const dispatch = createEventDispatcher()
|
|
51
|
-
|
|
52
|
-
function dispatchSelected(_data: BaseItem | BaseItem[] | undefined) {
|
|
53
|
-
value = _data
|
|
54
|
-
dispatch('selected', _data)
|
|
55
|
-
}
|
|
56
|
-
$: metaType = getFieldMetaType(cell.field!, mode === 'filtre')
|
|
57
|
-
|
|
58
|
-
const isViewMode = (_mode: 'edit' | 'view' | 'filtre', _field?: FieldMetadata<any, any>) => {
|
|
59
|
-
return _mode === 'view' || _field?.dbReadOnly || _field?.options.allowApiUpdate === false
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const common = (_field?: FieldMetadata<any, any>, isLight = false) => {
|
|
63
|
-
let toRet = {
|
|
64
|
-
id: _field?.key ?? 'SOMETHING_AT_LEAST',
|
|
65
|
-
disabled: _field?.dbReadOnly || _field?.options.allowApiUpdate === false || disabled,
|
|
66
|
-
placeholder: _field?.options?.placeholder ?? undefined,
|
|
67
|
-
}
|
|
68
|
-
if (isLight) {
|
|
69
|
-
return toRet
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
...toRet,
|
|
73
|
-
step: _field?.options?.step ?? undefined,
|
|
74
|
-
name: _field?.key,
|
|
75
|
-
// required: _field?.allowNull === false,
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const toInput = (_metadata?: FieldMetadata<any, any>, _value?: HTMLInputAttributes['value']) => {
|
|
80
|
-
try {
|
|
81
|
-
return _metadata?.valueConverter.toInput(_value, metaType.subKind)
|
|
82
|
-
} catch (error) {
|
|
83
|
-
console.error(`error toInput w field '${_metadata?.key}'`, error)
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const fromInput = (_metadata: FieldMetadata<any, any>, _value: HTMLInputAttributes['value']) => {
|
|
88
|
-
try {
|
|
89
|
-
// REMULT default for numbers ?
|
|
90
|
-
if (_metadata.allowNull && _value === null) {
|
|
91
|
-
return null
|
|
92
|
-
}
|
|
93
|
-
return _metadata?.valueConverter.fromInput(_value, metaType.subKind)
|
|
94
|
-
} catch (error) {
|
|
95
|
-
console.error(`error fromInput w field '${_metadata.key}'`, error)
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// let items: any[] = []
|
|
100
|
-
|
|
101
|
-
const getId = () => {
|
|
102
|
-
return value?.id || value
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const getLoadOptions = async (cellsValues: any, str: string) => {
|
|
106
|
-
if (metaType.kind !== 'relation') {
|
|
107
|
-
return { items: [], totalCount: 0 }
|
|
108
|
-
}
|
|
109
|
-
// To make TS happy
|
|
110
|
-
const metaTypeObj = { ...metaType } as MetaTypeRelation
|
|
111
|
-
|
|
112
|
-
let findToUse: FindOptions<any> = {}
|
|
113
|
-
if (metaTypeObj.repoTarget.metadata.options.searchableFind) {
|
|
114
|
-
// narrowFind at the end because searchableFind should not change the narrowed part!
|
|
115
|
-
findToUse = metaTypeObj.repoTarget.metadata.options.searchableFind(str)
|
|
116
|
-
} else {
|
|
117
|
-
if (str) {
|
|
118
|
-
const field = getFirstInterestingField(metaTypeObj.repoTarget)
|
|
119
|
-
findToUse = { where: { [field.key]: { $contains: str } } }
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const foEdit = cell.field?.options.findOptionsForEdit
|
|
124
|
-
const narrowFindEditWhere =
|
|
125
|
-
typeof foEdit === 'function'
|
|
126
|
-
? (foEdit(cellsValues).where ?? {})
|
|
127
|
-
: typeof foEdit === 'object'
|
|
128
|
-
? (foEdit.where ?? {})
|
|
129
|
-
: {}
|
|
130
|
-
|
|
131
|
-
// @ts-ignore
|
|
132
|
-
const foCrud = cell.field?.options.findOptions
|
|
133
|
-
const narrowFindCrudWhere =
|
|
134
|
-
typeof foCrud === 'function'
|
|
135
|
-
? (foCrud().where ?? {})
|
|
136
|
-
: typeof foCrud === 'object'
|
|
137
|
-
? (foCrud.where ?? {})
|
|
138
|
-
: {}
|
|
139
|
-
|
|
140
|
-
findToUse = {
|
|
141
|
-
include: { ...(findToUse.include ?? {}) },
|
|
142
|
-
where: { $and: [findToUse.where, narrowFindEditWhere, narrowFindCrudWhere] },
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// 24 here is a "magic number"!
|
|
146
|
-
let limit = cell.field?.options.findOptionsLimit ?? 24
|
|
147
|
-
|
|
148
|
-
const arr = []
|
|
149
|
-
arr.push(
|
|
150
|
-
...(await metaTypeObj.repoTarget.find({
|
|
151
|
-
...findToUse,
|
|
152
|
-
limit,
|
|
153
|
-
})),
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
let totalCount = arr.length
|
|
157
|
-
// If we are at the limit... there is probably more! How many?
|
|
158
|
-
if (totalCount === limit) {
|
|
159
|
-
const agg = await metaTypeObj.repoTarget.aggregate({ where: findToUse.where })
|
|
160
|
-
totalCount = agg.$count
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if (!cell.field?.options.multiSelect) {
|
|
164
|
-
// let's get the current item if it's not in the default list (only when there is no searchFilter going on)
|
|
165
|
-
if (str === '' && getId() && !arr.find((r) => String(r.id) === String(getId()))) {
|
|
166
|
-
arr.unshift(await metaTypeObj.repoTarget.findId(getId()))
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return { items: arr.map((r) => getEntityDisplayValue(metaTypeObj.repoTarget, r)), totalCount }
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const getMultiValues = (value: any) => {
|
|
174
|
-
return (value ?? []).map((c: any) => c.id) || value
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const calcSuffix = (value: any) => {
|
|
178
|
-
if (cell.field?.options.suffixEdit) {
|
|
179
|
-
if (cell.field?.options.suffixEditWithS) {
|
|
180
|
-
return suffixWithS(value, cell.field?.options.suffixEdit)
|
|
181
|
-
} else {
|
|
182
|
-
return cell.field?.options.suffixEdit
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (cell.field?.options.suffix) {
|
|
187
|
-
if (cell.field?.options.suffixWithS) {
|
|
188
|
-
return suffixWithS(value, cell.field?.options.suffix)
|
|
189
|
-
} else {
|
|
190
|
-
return cell.field?.options.suffix
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return ''
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
let textpsdVisible = false
|
|
198
|
-
</script>
|
|
199
|
-
|
|
200
|
-
<FieldContainer
|
|
201
|
-
forId={cell.field?.key ?? ''}
|
|
202
|
-
label={cell?.header ?? cell.field?.caption ?? cell.field?.key}
|
|
203
|
-
required={!cell.field?.allowNull && mode === 'edit' && metaType.subKind !== 'checkbox'}
|
|
204
|
-
{error}
|
|
205
|
-
classes={{ slot: metaType.subKind === 'textarea' ? 'h-24 items-start' : '' }}
|
|
206
|
-
>
|
|
207
|
-
{@const clearableComputed =
|
|
208
|
-
cell.clearable || clearable || (mode === 'filtre' && clearable === undefined)}
|
|
209
|
-
{#if isViewMode(mode, cell.field)}
|
|
210
|
-
<span class="flex items-center pr-4 pl-2">
|
|
211
|
-
{#if cell.field?.inputType === 'checkbox'}
|
|
212
|
-
<input
|
|
213
|
-
type="checkbox"
|
|
214
|
-
{...common(cell.field)}
|
|
215
|
-
class="checkbox ml-2 border-base-content/60"
|
|
216
|
-
disabled
|
|
217
|
-
checked={value}
|
|
218
|
-
/>
|
|
219
|
-
{:else if metaType.kind === 'relation'}
|
|
220
|
-
{@const item = getEntityDisplayValue(metaType.repoTarget, value)}
|
|
221
|
-
<div class={tw('flex items-center gap-4', 'h-12', 'pl-2')}>
|
|
222
|
-
<LinkPlus {item}></LinkPlus>
|
|
223
|
-
</div>
|
|
224
|
-
{:else if metaType.kind === 'enum'}
|
|
225
|
-
{@const v = displayWithDefaultAndSuffix(cell.field, value)}
|
|
226
|
-
<div class="ml-2 flex h-12 items-center gap-4">
|
|
227
|
-
{#if value?.icon}
|
|
228
|
-
<Icon {...value.icon} />
|
|
229
|
-
{/if}
|
|
230
|
-
<Clipboardable value={v}>{v}</Clipboardable>
|
|
231
|
-
</div>
|
|
232
|
-
{:else if metaType.subKind === 'link'}
|
|
233
|
-
<div class="ml-2 flex h-12 max-w-sm items-center gap-4 truncate">
|
|
234
|
-
{#if value}
|
|
235
|
-
<Link href={value} target="_blank" isExternal
|
|
236
|
-
>{midTrim(value.replaceAll('https://', '').replaceAll('www.', ''), {
|
|
237
|
-
len: 38,
|
|
238
|
-
midStr: ' ... ',
|
|
239
|
-
})}</Link
|
|
240
|
-
>
|
|
241
|
-
{:else}
|
|
242
|
-
<span class="text-base-content/30">-</span>
|
|
243
|
-
{/if}
|
|
244
|
-
</div>
|
|
245
|
-
{:else}
|
|
246
|
-
{@const v = displayWithDefaultAndSuffix(cell.field, value)}
|
|
247
|
-
<div
|
|
248
|
-
class="ml-2 pb-2 flex h-12 w-full items-center {metaType.subKind === 'number' ? 'justify-end' : ''}"
|
|
249
|
-
>
|
|
250
|
-
<Clipboardable value={v}>{v}</Clipboardable>
|
|
251
|
-
</div>
|
|
252
|
-
{/if}
|
|
253
|
-
</span>
|
|
254
|
-
{:else if metaType.kind === 'relation'}
|
|
255
|
-
{#if metaType.field.options.multiSelect}
|
|
256
|
-
<MultiSelectMelt
|
|
257
|
-
{...common(cell.field, true)}
|
|
258
|
-
clearable={clearableComputed}
|
|
259
|
-
loadOptions={async (str) => await getLoadOptions(cellsValues, str)}
|
|
260
|
-
values={value}
|
|
261
|
-
on:selected={(e) => dispatchSelected(e.detail)}
|
|
262
|
-
/>
|
|
263
|
-
{:else}
|
|
264
|
-
<!-- {items} -->
|
|
265
|
-
<SelectMelt
|
|
266
|
-
{focus}
|
|
267
|
-
{...common(cell.field, true)}
|
|
268
|
-
clearable={clearableComputed}
|
|
269
|
-
loadOptions={async (str) => await getLoadOptions(cellsValues, str)}
|
|
270
|
-
value={value?.id || value}
|
|
271
|
-
on:selected={(e) => dispatchSelected(e.detail)}
|
|
272
|
-
on:issue={(e) => {
|
|
273
|
-
error = e.detail
|
|
274
|
-
}}
|
|
275
|
-
createOptionWhenNoResult={!!cell.field?.options.createOptionWhenNoResult}
|
|
276
|
-
{createRequest}
|
|
277
|
-
default_select_if_one_item={!!cell.field?.options.default_select_if_one_item}
|
|
278
|
-
/>
|
|
279
|
-
{/if}
|
|
280
|
-
{:else if metaType.kind === 'enum'}
|
|
281
|
-
{#if metaType.field.options.multiSelect || metaType.subKind === 'multi'}
|
|
282
|
-
<MultiSelectMelt
|
|
283
|
-
{...common(cell.field, true)}
|
|
284
|
-
clearable={clearableComputed}
|
|
285
|
-
items={metaType.values}
|
|
286
|
-
values={getMultiValues(value)}
|
|
287
|
-
on:selected={(e) => {
|
|
288
|
-
dispatchSelected(e.detail)
|
|
289
|
-
}}
|
|
290
|
-
/>
|
|
291
|
-
{:else if metaType.values.length <= (cell.field?.options.styleRadioUntil ?? 3) && !clearableComputed}
|
|
292
|
-
<SelectRadio
|
|
293
|
-
{...common(cell.field, true)}
|
|
294
|
-
items={metaType.values}
|
|
295
|
-
value={value?.id || value}
|
|
296
|
-
on:selected={(e) => dispatchSelected(e.detail)}
|
|
297
|
-
/>
|
|
298
|
-
{:else}
|
|
299
|
-
<!-- <Select2
|
|
300
|
-
{...common(cell.field, true)}
|
|
301
|
-
clearable={clearableComputed}
|
|
302
|
-
items={metaType.values}
|
|
303
|
-
value={value?.id || value}
|
|
304
|
-
onChange={(e) => dispatchSelected(metaType.values.find((v) => v.id === e))}
|
|
305
|
-
/> -->
|
|
306
|
-
<SelectMelt
|
|
307
|
-
{focus}
|
|
308
|
-
{...common(cell.field, true)}
|
|
309
|
-
clearable={clearableComputed}
|
|
310
|
-
items={metaType.values}
|
|
311
|
-
value={value?.id || value}
|
|
312
|
-
on:selected={(e) => dispatchSelected(e.detail)}
|
|
313
|
-
on:issue={(e) => {
|
|
314
|
-
error = e.detail
|
|
315
|
-
}}
|
|
316
|
-
/>
|
|
317
|
-
{/if}
|
|
318
|
-
{:else if metaType.subKind === 'checkbox'}
|
|
319
|
-
<div class="grid content-center items-center pl-4 pb-2">
|
|
320
|
-
<input
|
|
321
|
-
type="checkbox"
|
|
322
|
-
{...{ ...common(cell.field), required: undefined }}
|
|
323
|
-
class="checkbox"
|
|
324
|
-
checked={value}
|
|
325
|
-
on:input={(e) => {
|
|
326
|
-
// @ts-ignore
|
|
327
|
-
value = e.target.checked
|
|
328
|
-
dispatchSelected(value)
|
|
329
|
-
}}
|
|
330
|
-
/>
|
|
331
|
-
</div>
|
|
332
|
-
{:else if metaType.subKind === 'text' || metaType.subKind === 'email' || metaType.subKind === 'password' || metaType.subKind === 'date' || metaType.subKind === 'number' || metaType.subKind === 'textpsd' || metaType.subKind === 'link'}
|
|
333
|
-
<div class="input inline-flex w-full items-center pl-2">
|
|
334
|
-
<Input
|
|
335
|
-
{focus}
|
|
336
|
-
{...common(cell.field)}
|
|
337
|
-
autocomplete="off"
|
|
338
|
-
class={tw(
|
|
339
|
-
`join-item w-full placeholder:text-base-content/30`,
|
|
340
|
-
metaType.subKind === 'number' && 'text-end',
|
|
341
|
-
)}
|
|
342
|
-
style={cell.field?.inputType === 'textpsd' && textpsdVisible === false
|
|
343
|
-
? 'filter: blur(0.2rem)'
|
|
344
|
-
: ''}
|
|
345
|
-
type={metaType.subKind.replaceAll('textpsd', 'text').replaceAll('link', 'text')}
|
|
346
|
-
value={toInput(cell.field, value)}
|
|
347
|
-
{withDedounce}
|
|
348
|
-
on:input={(e) => {
|
|
349
|
-
// @ts-ignore
|
|
350
|
-
value = fromInput(cell.field, e.detail.value)
|
|
351
|
-
dispatchSelected(value)
|
|
352
|
-
}}
|
|
353
|
-
{...$$restProps}
|
|
354
|
-
/>
|
|
355
|
-
{calcSuffix(value)}
|
|
356
|
-
{#if cell.field?.inputType === 'textpsd'}
|
|
357
|
-
<button
|
|
358
|
-
on:click={(e) => {
|
|
359
|
-
e.preventDefault()
|
|
360
|
-
textpsdVisible = !textpsdVisible
|
|
361
|
-
}}
|
|
362
|
-
class="btn-ghost btn-sm"
|
|
363
|
-
>
|
|
364
|
-
<Icon data={textpsdVisible ? LibIcon_Eye : LibIcon_EyeOff} />
|
|
365
|
-
</button>
|
|
366
|
-
{/if}
|
|
367
|
-
</div>
|
|
368
|
-
{:else if metaType.subKind === 'textarea'}
|
|
369
|
-
<Textarea
|
|
370
|
-
{focus}
|
|
371
|
-
{...common(cell.field)}
|
|
372
|
-
value={toInput(cell.field, value)}
|
|
373
|
-
on:input={(e) => {
|
|
374
|
-
// @ts-ignore
|
|
375
|
-
value = fromInput(cell.field, e.detail.value)
|
|
376
|
-
}}
|
|
377
|
-
/>
|
|
378
|
-
{:else}
|
|
379
|
-
<!-- This shoud NEVER be displayed -->
|
|
380
|
-
<span class="flex items-center pl-2 text-error">Type "{cell.field?.inputType}" not managed!</span>
|
|
381
|
-
{/if}
|
|
382
|
-
</FieldContainer>
|
package/esm/ui/Field.svelte.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
2
|
-
import { type Cell } from '../internals';
|
|
3
|
-
declare class __sveltets_Render<T extends Record<any, any>> {
|
|
4
|
-
props(): {
|
|
5
|
-
[x: string]: any;
|
|
6
|
-
cell: Cell<T>;
|
|
7
|
-
value?: HTMLInputAttributes["value"];
|
|
8
|
-
cellsValues?: any;
|
|
9
|
-
withDedounce?: boolean | undefined;
|
|
10
|
-
error?: string | undefined;
|
|
11
|
-
mode?: "edit" | "view" | "filtre" | undefined;
|
|
12
|
-
focus?: boolean | undefined;
|
|
13
|
-
clearable?: boolean | undefined | undefined;
|
|
14
|
-
disabled?: boolean | undefined;
|
|
15
|
-
createRequest?: ((args: {
|
|
16
|
-
input: string;
|
|
17
|
-
id: string;
|
|
18
|
-
}) => void) | undefined;
|
|
19
|
-
};
|
|
20
|
-
events(): {
|
|
21
|
-
selected: CustomEvent<any>;
|
|
22
|
-
} & {
|
|
23
|
-
[evt: string]: CustomEvent<any>;
|
|
24
|
-
};
|
|
25
|
-
slots(): {};
|
|
26
|
-
bindings(): string;
|
|
27
|
-
exports(): {};
|
|
28
|
-
}
|
|
29
|
-
interface $$IsomorphicComponent {
|
|
30
|
-
new <T extends Record<any, any>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
31
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
32
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
33
|
-
<T extends Record<any, any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {
|
|
34
|
-
$$events?: ReturnType<__sveltets_Render<T>['events']>;
|
|
35
|
-
}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
36
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
37
|
-
}
|
|
38
|
-
declare const Field: $$IsomorphicComponent;
|
|
39
|
-
type Field<T extends Record<any, any>> = InstanceType<typeof Field<T>>;
|
|
40
|
-
export default Field;
|
package/esm/ui/FieldGroup.svelte
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
<script lang="ts" generics="T extends Record<any, any>">
|
|
2
|
-
import { createEventDispatcher } from 'svelte'
|
|
3
|
-
|
|
4
|
-
import type { FieldMetadata } from 'remult'
|
|
5
|
-
import { getRelationFieldInfo } from 'remult/internals'
|
|
6
|
-
|
|
7
|
-
import { tw, type StoreItem } from '../internals'
|
|
8
|
-
import type { Cell } from '../internals/cellsBuildor'
|
|
9
|
-
import Field from './Field.svelte'
|
|
10
|
-
import FieldContainer from './internals/FieldContainer.svelte'
|
|
11
|
-
import Loading from './Loading.svelte'
|
|
12
|
-
|
|
13
|
-
type Mode = 'edit' | 'view' | 'filtre'
|
|
14
|
-
export let mode: Mode = 'edit'
|
|
15
|
-
|
|
16
|
-
export let cells: Cell<T>[]
|
|
17
|
-
export let store: StoreItem<T>
|
|
18
|
-
|
|
19
|
-
export let focusKey: string | null | undefined = null
|
|
20
|
-
export let createRequest: ((args: { input: string; id: string }) => void) | undefined = undefined
|
|
21
|
-
|
|
22
|
-
const getError = (errors: any, field: FieldMetadata<any, any>) => {
|
|
23
|
-
const fo = getRelationFieldInfo(field)
|
|
24
|
-
const keyToUse = fo?.options?.field
|
|
25
|
-
if (errors && keyToUse && errors[keyToUse]) {
|
|
26
|
-
return errors[keyToUse]
|
|
27
|
-
} else if (errors && errors[field.key]) {
|
|
28
|
-
return errors[field.key]
|
|
29
|
-
}
|
|
30
|
-
return undefined
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const shouldHide = (c: Cell<T>, mode: Mode) => {
|
|
34
|
-
if (mode === 'edit' && c.modeEdit === 'hide') {
|
|
35
|
-
return true
|
|
36
|
-
}
|
|
37
|
-
if (mode === 'view' && c.modeView === 'hide') {
|
|
38
|
-
return true
|
|
39
|
-
}
|
|
40
|
-
return false
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const modeToUse = (c: Cell<T>, mode: Mode) => {
|
|
44
|
-
if (mode === 'edit' && c.modeEdit === 'view') {
|
|
45
|
-
return 'view'
|
|
46
|
-
}
|
|
47
|
-
if (mode === 'view' && c.modeView === 'edit') {
|
|
48
|
-
return 'edit'
|
|
49
|
-
}
|
|
50
|
-
return mode
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const dispatch = createEventDispatcher()
|
|
54
|
-
|
|
55
|
-
function dispatchChanged(_data: T | undefined) {
|
|
56
|
-
dispatch('changed', _data)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
$: dispatchChanged($store.item)
|
|
60
|
-
|
|
61
|
-
let size = ['', 'w-1/2', 'w-1/3', 'w-1/4', 'w-1/5', 'w-1/6']
|
|
62
|
-
|
|
63
|
-
function isToFocus(
|
|
64
|
-
currentKey: string | undefined,
|
|
65
|
-
focusKey: string | null | undefined,
|
|
66
|
-
i: number,
|
|
67
|
-
): boolean {
|
|
68
|
-
if (focusKey === null || focusKey === undefined) {
|
|
69
|
-
if (i === 0) {
|
|
70
|
-
return true
|
|
71
|
-
}
|
|
72
|
-
return false
|
|
73
|
-
}
|
|
74
|
-
return focusKey === currentKey
|
|
75
|
-
}
|
|
76
|
-
</script>
|
|
77
|
-
|
|
78
|
-
{#each cells as cell, i}
|
|
79
|
-
{@const focus = isToFocus(cell.field?.key, focusKey, i)}
|
|
80
|
-
{#if shouldHide(cell, mode)}
|
|
81
|
-
<!-- Do nothing -->
|
|
82
|
-
{:else if cell.field && !cell.field.includedInApi($store.item)}
|
|
83
|
-
<!-- Do nothing, but keep the class... -->
|
|
84
|
-
<div class={cell.class}></div>
|
|
85
|
-
{:else}
|
|
86
|
-
<div class={cell.class}>
|
|
87
|
-
{#if cell.kind === 'header'}
|
|
88
|
-
<span>{cell.header}</span>
|
|
89
|
-
{:else if cell.field && (!$store || $store.loading)}
|
|
90
|
-
<!-- If the store is not ready mdiYeast, or in loading... -->
|
|
91
|
-
<FieldContainer label={cell.field.caption} forId={cell.field.key}>
|
|
92
|
-
<Loading
|
|
93
|
-
class={tw(
|
|
94
|
-
`mx-4 my-3 h-6`,
|
|
95
|
-
size[parseInt((((i + 1) * Math.random() * size.length) % size.length).toString())],
|
|
96
|
-
)}
|
|
97
|
-
/>
|
|
98
|
-
</FieldContainer>
|
|
99
|
-
{:else if cell.kind === 'slot'}
|
|
100
|
-
<slot name="field" field={cell.field} {focus} />
|
|
101
|
-
{:else if cell.field && $store.item}
|
|
102
|
-
<Field
|
|
103
|
-
mode={modeToUse(cell, mode)}
|
|
104
|
-
{cell}
|
|
105
|
-
cellsValues={$store.item}
|
|
106
|
-
bind:value={$store.item[cell.field.key]}
|
|
107
|
-
error={getError($store.errors, cell.field)}
|
|
108
|
-
{focus}
|
|
109
|
-
{createRequest}
|
|
110
|
-
/>
|
|
111
|
-
<!-- disabled={isDisableFieldDynamic(cell)} -->
|
|
112
|
-
{:else}
|
|
113
|
-
FieldGroup : Case not handled
|
|
114
|
-
{/if}
|
|
115
|
-
</div>
|
|
116
|
-
{/if}
|
|
117
|
-
{/each}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { FieldMetadata } from 'remult';
|
|
2
|
-
import { type StoreItem } from '../internals';
|
|
3
|
-
import type { Cell } from '../internals/cellsBuildor';
|
|
4
|
-
declare class __sveltets_Render<T extends Record<any, any>> {
|
|
5
|
-
props(): {
|
|
6
|
-
mode?: "view" | "edit" | "filtre";
|
|
7
|
-
cells: Cell<T>[];
|
|
8
|
-
store: StoreItem<T>;
|
|
9
|
-
focusKey?: string | null | undefined;
|
|
10
|
-
createRequest?: ((args: {
|
|
11
|
-
input: string;
|
|
12
|
-
id: string;
|
|
13
|
-
}) => void) | undefined;
|
|
14
|
-
};
|
|
15
|
-
events(): {
|
|
16
|
-
changed: CustomEvent<any>;
|
|
17
|
-
} & {
|
|
18
|
-
[evt: string]: CustomEvent<any>;
|
|
19
|
-
};
|
|
20
|
-
slots(): {
|
|
21
|
-
field: {
|
|
22
|
-
field: FieldMetadata<any, T> | undefined;
|
|
23
|
-
focus: typeof focus;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
bindings(): string;
|
|
27
|
-
exports(): {};
|
|
28
|
-
}
|
|
29
|
-
interface $$IsomorphicComponent {
|
|
30
|
-
new <T extends Record<any, any>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']> & {
|
|
31
|
-
children?: any;
|
|
32
|
-
}>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
33
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
34
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
35
|
-
<T extends Record<any, any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {
|
|
36
|
-
$$events?: ReturnType<__sveltets_Render<T>['events']>;
|
|
37
|
-
$$slots?: ReturnType<__sveltets_Render<T>['slots']>;
|
|
38
|
-
children?: any;
|
|
39
|
-
}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
40
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
41
|
-
}
|
|
42
|
-
declare const FieldGroup: $$IsomorphicComponent;
|
|
43
|
-
type FieldGroup<T extends Record<any, any>> = InstanceType<typeof FieldGroup<T>>;
|
|
44
|
-
export default FieldGroup;
|