@masterteam/form-builder 0.0.1 → 0.0.3

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 (35) hide show
  1. package/assets/form-builder.css +2 -4
  2. package/assets/i18n/ar.json +2 -0
  3. package/assets/i18n/en.json +2 -0
  4. package/fesm2022/masterteam-form-builder.mjs +1908 -0
  5. package/fesm2022/masterteam-form-builder.mjs.map +1 -0
  6. package/package.json +16 -16
  7. package/types/masterteam-form-builder.d.ts +297 -0
  8. package/.angular/cache/21.0.2/ng-packagr/db70d8f07b5a2d2d1c3124ca92e8d56d14fb894dce4d4867ba7c0db29ba913a3 +0 -1
  9. package/.angular/cache/21.0.2/ng-packagr/tsbuildinfo/masterteam-form-builder.tsbuildinfo +0 -1
  10. package/BACKEND_API_SPEC.md +0 -338
  11. package/angular.json +0 -26
  12. package/ng-package.json +0 -13
  13. package/src/lib/fb-field-conditions/condition-constants.ts +0 -262
  14. package/src/lib/fb-field-conditions/fb-field-conditions.html +0 -35
  15. package/src/lib/fb-field-conditions/fb-field-conditions.ts +0 -123
  16. package/src/lib/fb-field-form/fb-field-form.html +0 -59
  17. package/src/lib/fb-field-form/fb-field-form.ts +0 -249
  18. package/src/lib/fb-preview-form/fb-preview-form.html +0 -31
  19. package/src/lib/fb-preview-form/fb-preview-form.ts +0 -142
  20. package/src/lib/fb-section/fb-section.html +0 -130
  21. package/src/lib/fb-section/fb-section.ts +0 -204
  22. package/src/lib/fb-section-form/fb-section-form.html +0 -38
  23. package/src/lib/fb-section-form/fb-section-form.ts +0 -128
  24. package/src/lib/form-builder.html +0 -112
  25. package/src/lib/form-builder.model.ts +0 -60
  26. package/src/lib/form-builder.scss +0 -20
  27. package/src/lib/form-builder.ts +0 -208
  28. package/src/public-api.ts +0 -6
  29. package/src/store/form-builder/api.model.ts +0 -13
  30. package/src/store/form-builder/form-builder.actions.ts +0 -98
  31. package/src/store/form-builder/form-builder.facade.ts +0 -194
  32. package/src/store/form-builder/form-builder.model.ts +0 -112
  33. package/src/store/form-builder/form-builder.state.ts +0 -575
  34. package/src/store/form-builder/index.ts +0 -5
  35. package/tsconfig.json +0 -31
@@ -1,130 +0,0 @@
1
- <ng-container *transloco="let t; prefix: 'formBuilder'">
2
- <div class="flex flex-col">
3
- <div
4
- class="flex justify-between items-center bg-primary text-primary-contrast p-2 rounded-xl"
5
- >
6
- <mt-button
7
- size="small"
8
- icon="arrow.chevron-down"
9
- class="transition-[rotate]"
10
- [class.rotate-180]="expanded()"
11
- (onClick)="toggleExpanded()"
12
- ></mt-button>
13
- <span class="font-bold">
14
- {{ sectionName() }}
15
- </span>
16
- <div class="flex gap-2">
17
- <mt-button
18
- size="small"
19
- icon="general.edit-02"
20
- [tooltip]="t('edit-section')"
21
- (onClick)="editSection($event)"
22
- ></mt-button>
23
- </div>
24
- </div>
25
- @if (expanded()) {
26
- <div
27
- cdkDropList
28
- [id]="section().id"
29
- cdkDropListOrientation="mixed"
30
- [cdkDropListData]="fields()"
31
- (cdkDropListDropped)="onDrop($event)"
32
- class="grid grid-cols-12 gap-4 relative py-4"
33
- [class.min-h-27]="fields().length === 0"
34
- >
35
- @for (field of fields(); track field.id) {
36
- <div
37
- cdkDrag
38
- [cdkDragData]="field"
39
- [cdkDragDisabled]="field._pending || field._deleting"
40
- [class]="
41
- getFieldColSpan(field) + ' cursor-grab active:cursor-grabbing'
42
- "
43
- >
44
- <div
45
- *cdkDragPlaceholder
46
- [class]="
47
- 'h-full min-h-27 bg-black/10 rounded-2xl ' +
48
- getFieldColSpan(field)
49
- "
50
- ></div>
51
- @if (field._pending) {
52
- <!-- Skeleton for pending field -->
53
- <mt-card class="h-full animate-pulse">
54
- <div class="flex gap-2">
55
- <div class="flex-1 space-y-3">
56
- <div class="h-4 bg-surface-200 rounded w-1/3"></div>
57
- <div class="h-10 bg-surface-200 rounded"></div>
58
- </div>
59
- <div class="flex flex-col gap-1">
60
- <div class="h-8 w-8 bg-surface-200 rounded"></div>
61
- <div class="h-8 w-8 bg-surface-200 rounded"></div>
62
- </div>
63
- </div>
64
- </mt-card>
65
- } @else {
66
- <mt-card
67
- class="h-full relative"
68
- [class.opacity-50]="field._deleting"
69
- >
70
- @if (field._deleting) {
71
- <div
72
- class="absolute inset-0 flex items-center justify-center bg-white/50 rounded-xl z-10"
73
- >
74
- <div
75
- class="animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full"
76
- ></div>
77
- </div>
78
- }
79
- <div class="flex gap-2">
80
- <div class="flex-1">
81
- <form [formGroup]="getFormGroup(field)">
82
- <mt-dynamic-field
83
- [fieldName]="field.name"
84
- [fieldConfig]="{
85
- label: field.name,
86
- readonly: true,
87
- type: getFieldType(field),
88
- }"
89
- />
90
- </form>
91
- </div>
92
- <div class="flex flex-col gap-1">
93
- <mt-button
94
- size="small"
95
- icon="general.settings-01"
96
- [tooltip]="t('edit-field')"
97
- outlined
98
- [disabled]="field._deleting"
99
- (onClick)="editField(field)"
100
- ></mt-button>
101
- <mt-button
102
- size="small"
103
- icon="general.trash-01"
104
- severity="danger"
105
- outlined
106
- [tooltip]="t('remove-field')"
107
- [disabled]="field._deleting"
108
- (onClick)="removeField($event, field)"
109
- ></mt-button>
110
- </div>
111
- </div>
112
- </mt-card>
113
- }
114
- </div>
115
- } @empty {
116
- <mt-card class="absolute inset-0 top-4 h-full" paddingless>
117
- <div class="size-full p-4">
118
- <div
119
- class="flex justify-center items-center gap-4 h-full border-2 border-primary rounded-xl bg-primary-200 text-primary"
120
- >
121
- <mt-icon icon="editor.move" class="text-3xl" />
122
- <span>{{ t("drag-from-the-side") }}</span>
123
- </div>
124
- </div>
125
- </mt-card>
126
- }
127
- </div>
128
- }
129
- </div>
130
- </ng-container>
@@ -1,204 +0,0 @@
1
- import {
2
- Component,
3
- computed,
4
- inject,
5
- input,
6
- output,
7
- signal,
8
- effect,
9
- } from '@angular/core';
10
- import { EnrichedFormField, EnrichedFormSection } from '../form-builder.model';
11
- import { ConfirmationService } from '@masterteam/components/confirmation';
12
- import { ModalService } from '@masterteam/components/modal';
13
- import { TranslocoService } from '@jsverse/transloco';
14
- import { Button } from '@masterteam/components/button';
15
- import { Card } from '@masterteam/components/card';
16
- import {
17
- CdkDrag,
18
- CdkDragDrop,
19
- CdkDragPlaceholder,
20
- CdkDropList,
21
- } from '@angular/cdk/drag-drop';
22
- import { TranslocoDirective } from '@jsverse/transloco';
23
- import { DynamicField } from '@masterteam/forms/dynamic-field';
24
- import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';
25
- import { Icon } from '@masterteam/icons';
26
- import { FormBuilderFacade } from '../../store/form-builder';
27
- import { FBFieldForm } from '../fb-field-form/fb-field-form';
28
- import { FBSectionForm } from '../fb-section-form/fb-section-form';
29
-
30
- @Component({
31
- selector: 'mt-fb-section',
32
- standalone: true,
33
- imports: [
34
- Button,
35
- Card,
36
- Icon,
37
- CdkDrag,
38
- CdkDropList,
39
- CdkDragPlaceholder,
40
- TranslocoDirective,
41
- DynamicField,
42
- ReactiveFormsModule,
43
- ],
44
- templateUrl: './fb-section.html',
45
- })
46
- export class FBSection {
47
- private readonly confirmationService = inject(ConfirmationService);
48
- private readonly modalService = inject(ModalService);
49
- private readonly translocoService = inject(TranslocoService);
50
- private readonly facade = inject(FormBuilderFacade);
51
-
52
- // Inputs
53
- readonly section = input.required<EnrichedFormSection>();
54
- readonly sectionsCount = input<number>(0);
55
- /** All sections - used to get available fields for condition formulas */
56
- readonly allSections = input<EnrichedFormSection[]>([]);
57
-
58
- // Outputs - only keep drag/drop since it needs coordination with parent drop list group
59
- readonly onFieldDrop = output<CdkDragDrop<EnrichedFormField[]>>();
60
-
61
- // Computed
62
- readonly sectionName = computed(() => {
63
- const lang = document.documentElement.lang as 'en' | 'ar';
64
- const section = this.section();
65
- return section.name[lang] ?? section.name['en'];
66
- });
67
-
68
- readonly fields = computed(() => this.section().fields);
69
-
70
- // UI State
71
- readonly expanded = signal(true);
72
-
73
- // Form groups cache for dynamic fields
74
- private readonly formGroupsCache = new Map<string, FormGroup>();
75
-
76
- constructor() {
77
- // Cleanup stale form groups when fields change
78
- effect(() => {
79
- const currentIds = new Set(this.fields().map((f) => f.id));
80
- for (const id of this.formGroupsCache.keys()) {
81
- if (!currentIds.has(id)) {
82
- this.formGroupsCache.delete(id);
83
- }
84
- }
85
- });
86
- }
87
-
88
- getFormGroup(field: EnrichedFormField): FormGroup {
89
- let fg = this.formGroupsCache.get(field.id);
90
-
91
- if (fg) {
92
- // Check if field name changed
93
- if (!fg.contains(field.name)) {
94
- const oldKey = Object.keys(fg.controls)[0];
95
- const value = oldKey ? fg.get(oldKey)?.value : field.data?.data;
96
-
97
- fg = new FormGroup({
98
- [field.name]: new FormControl(value),
99
- });
100
- this.formGroupsCache.set(field.id, fg);
101
- }
102
- } else {
103
- fg = new FormGroup({
104
- [field.name]: new FormControl(field.data?.data),
105
- });
106
- this.formGroupsCache.set(field.id, fg);
107
- }
108
-
109
- return fg;
110
- }
111
-
112
- toggleExpanded(): void {
113
- this.expanded.update((v) => !v);
114
- }
115
-
116
- onDrop(event: CdkDragDrop<EnrichedFormField[]>): void {
117
- this.onFieldDrop.emit(event);
118
- }
119
-
120
- editSection(event: Event): void {
121
- event.stopPropagation();
122
- const section = this.section();
123
-
124
- this.modalService.openModal(FBSectionForm, 'drawer', {
125
- header: this.translocoService.translate('formBuilder.edit-section'),
126
- height: '20vw',
127
- styleClass: '!w-100 !absolute ',
128
- position: 'end',
129
- appendTo: '#page-content',
130
- modal: false,
131
- inputValues: {
132
- sectionId: section.id,
133
- initialData: section.name,
134
- sectionsCount: this.sectionsCount(),
135
- },
136
- });
137
- }
138
-
139
- removeField(event: Event, field: EnrichedFormField): void {
140
- this.confirmationService.confirmDelete({
141
- event,
142
- type: 'popup',
143
- accept: () => {
144
- this.facade.deleteField(this.section().id, field.id);
145
- },
146
- });
147
- }
148
-
149
- editField(field: EnrichedFormField): void {
150
- this.modalService.openModal(FBFieldForm, 'drawer', {
151
- header: this.translocoService.translate('formBuilder.field-settings'),
152
- height: '20vw',
153
- styleClass: '!w-100 !absolute !shadow-none',
154
- position: 'end',
155
- modal: false,
156
- appendTo: '#page-content',
157
- inputValues: {
158
- initialData: field,
159
- sectionId: this.section().id,
160
- allSections: this.allSections(),
161
- },
162
- });
163
- }
164
-
165
- getFieldColSpan(field: EnrichedFormField): string {
166
- switch (field.width) {
167
- case '100':
168
- return 'col-span-12';
169
- case '50':
170
- return 'col-span-6';
171
- case '25':
172
- return 'col-span-3';
173
- default:
174
- return 'col-span-12';
175
- }
176
- }
177
-
178
- getFieldType(field: EnrichedFormField): string {
179
- const typeMap: Record<string, string> = {
180
- User: 'select',
181
- Text: 'text',
182
- LongText: 'editor-field',
183
- Percentage: 'slider',
184
- Date: 'date',
185
- Currency: 'text',
186
- Number: 'number',
187
- Lookup: 'select',
188
- LookupMultiSelect: 'select',
189
- Checkbox: 'toggle',
190
- InternalModule: 'select',
191
- DynamicList: 'select',
192
- API: 'select',
193
- Time: 'date',
194
- Status: 'select',
195
- Attachment: 'attachment',
196
- EditableListView: 'actionableTable',
197
- LookupLog: 'actionableTable',
198
- LookupMatrix: 'select',
199
- Location: 'select',
200
- };
201
-
202
- return typeMap[field.type] ?? 'text';
203
- }
204
- }
@@ -1,38 +0,0 @@
1
- <ng-container *transloco="let t; prefix: 'formBuilder'">
2
- <div [class]="[modalService.contentClass, 'p-4', 'overflow-y-hidden!']">
3
- <div class="mt-4 h-full overflow-y-auto pb-10">
4
- <mt-dynamic-form [formConfig]="formConfig" [formControl]="formControl">
5
- </mt-dynamic-form>
6
- </div>
7
- </div>
8
-
9
- <div [class]="modalService.footerClass">
10
- @if (sectionId()) {
11
- <mt-button
12
- [tooltip]="t('delete')"
13
- severity="danger"
14
- outlined
15
- icon="general.trash-01"
16
- [loading]="deleting()"
17
- [disabled]="submitting()"
18
- (onClick)="onDelete($event)"
19
- class="me-auto"
20
- ></mt-button>
21
- }
22
- <mt-button
23
- [label]="t('cancel')"
24
- severity="secondary"
25
- [disabled]="submitting() || deleting()"
26
- (onClick)="onCancel()"
27
- >
28
- </mt-button>
29
- <mt-button
30
- [disabled]="!formControl.valid || deleting()"
31
- [label]="t('save')"
32
- severity="primary"
33
- [loading]="submitting()"
34
- (onClick)="onSave()"
35
- >
36
- </mt-button>
37
- </div>
38
- </ng-container>
@@ -1,128 +0,0 @@
1
- import { Component, effect, inject, input, signal } from '@angular/core';
2
- import { TranslocoDirective, TranslocoService } from '@jsverse/transloco';
3
- import { ReactiveFormsModule, FormControl } from '@angular/forms';
4
- import { DynamicForm } from '@masterteam/forms/dynamic-form';
5
- import { DynamicFormConfig } from '@masterteam/components';
6
- import { Button } from '@masterteam/components/button';
7
- import { ModalService } from '@masterteam/components/modal';
8
- import { ModalRef } from '@masterteam/components/dialog';
9
- import { ConfirmationService } from '@masterteam/components/confirmation';
10
- import { FormBuilderFacade } from '../../store/form-builder';
11
-
12
- @Component({
13
- selector: 'mt-fb-section-form',
14
- standalone: true,
15
- imports: [TranslocoDirective, ReactiveFormsModule, DynamicForm, Button],
16
- templateUrl: './fb-section-form.html',
17
- })
18
- export class FBSectionForm {
19
- private readonly transloco = inject(TranslocoService);
20
- protected readonly modalService = inject(ModalService);
21
- private readonly ref = inject(ModalRef);
22
- private readonly confirmationService = inject(ConfirmationService);
23
- private readonly facade = inject(FormBuilderFacade);
24
-
25
- // Inputs
26
- readonly sectionId = input<string | null>(null);
27
- readonly initialData = input<{ ar: string; en: string } | null>(null);
28
- readonly sectionsCount = input<number>(0);
29
-
30
- // UI State
31
- readonly submitting = signal(false);
32
- readonly deleting = signal(false);
33
-
34
- // Form
35
- readonly formControl = new FormControl();
36
- readonly formConfig: DynamicFormConfig = {
37
- sections: [
38
- {
39
- key: 'section-form',
40
- type: 'none',
41
- columns: 12,
42
- order: 1,
43
- fields: [
44
- {
45
- key: 'name-ar',
46
- label: this.transloco.translate('formBuilder.name-ar'),
47
- type: 'text',
48
- placeholder: this.transloco.translate('formBuilder.name-ar'),
49
- colSpan: 12,
50
- order: 1,
51
- },
52
- {
53
- key: 'name-en',
54
- label: this.transloco.translate('formBuilder.name-en'),
55
- type: 'text',
56
- placeholder: this.transloco.translate('formBuilder.name-en'),
57
- colSpan: 12,
58
- order: 2,
59
- },
60
- ],
61
- },
62
- ],
63
- };
64
-
65
- constructor() {
66
- effect(() => {
67
- const data = this.initialData();
68
- if (data) {
69
- this.formControl.patchValue({
70
- 'name-ar': data.ar,
71
- 'name-en': data.en,
72
- });
73
- }
74
- });
75
- }
76
-
77
- onSave(): void {
78
- if (this.formControl.invalid) return;
79
-
80
- const formValue = this.formControl.value;
81
- const payload = {
82
- name: {
83
- ar: formValue['name-ar'],
84
- en: formValue['name-en'],
85
- },
86
- };
87
-
88
- this.submitting.set(true);
89
- const sectionId = this.sectionId();
90
-
91
- if (sectionId) {
92
- // Update existing section
93
- this.facade.updateSection(sectionId, payload).subscribe({
94
- next: () => this.ref.close(true),
95
- error: () => this.submitting.set(false),
96
- });
97
- } else {
98
- // Create new section
99
- this.facade
100
- .addSection({ ...payload, order: this.sectionsCount() })
101
- .subscribe({
102
- next: () => this.ref.close(true),
103
- error: () => this.submitting.set(false),
104
- });
105
- }
106
- }
107
-
108
- onCancel(): void {
109
- this.ref.close(false);
110
- }
111
-
112
- onDelete(event: Event): void {
113
- const sectionId = this.sectionId();
114
- if (!sectionId) return;
115
-
116
- this.confirmationService.confirmDelete({
117
- event,
118
- type: 'popup',
119
- accept: () => {
120
- this.deleting.set(true);
121
- this.facade.deleteSection(sectionId).subscribe({
122
- next: () => this.ref.close(true),
123
- error: () => this.deleting.set(false),
124
- });
125
- },
126
- });
127
- }
128
- }
@@ -1,112 +0,0 @@
1
- <ng-container *transloco="let t; prefix: 'formBuilder'">
2
- <div class="flex gap-4 h-full w-full overflow-hidden" cdkDropListGroup>
3
- @if (properties().length > 0) {
4
- <mt-card
5
- class="z-1 w-1/5 min-w-xs shrink-0 h-full flex flex-col overflow-hidden"
6
- >
7
- <ng-template #headless>
8
- <!-- Header -->
9
- <div class="flex items-center justify-between px-4 pt-5">
10
- <h3 class="text-xl font-semibold">{{ t("form-elements") }}</h3>
11
- </div>
12
-
13
- <!-- Tabs using PrimeNG -->
14
- <p-tabs
15
- [(value)]="activeTab"
16
- styleClass="structure-tabs"
17
- class="flex flex-1 flex-col min-h-0"
18
- >
19
- <p-tablist class="shrink-0">
20
- @for (tab of availableTabs(); track tab.id) {
21
- <p-tab [value]="tab.id">{{ tab.title | titlecase }}</p-tab>
22
- }
23
- </p-tablist>
24
- <p-tabpanels class="!bg-transparent !p-0 flex-1 overflow-hidden">
25
- @for (tab of availableTabs(); track tab.id) {
26
- <p-tabpanel [value]="tab.id" class="h-full">
27
- <!-- Node List -->
28
- <div
29
- class="space-y-1 p-4 [&_.cdk-drag-placeholder]:hidden h-full overflow-y-auto"
30
- [id]="'toolbox-' + tab.id"
31
- cdkDropList
32
- cdkDropListSortingDisabled
33
- [cdkDropListData]="tab.properties"
34
- [cdkDropListEnterPredicate]="noReturnPredicate"
35
- >
36
- @for (node of tab.properties; track $index) {
37
- <div
38
- cdkDrag
39
- [cdkDragData]="node"
40
- class="group cursor-move select-none relative flex items-center gap-3 py-3 px-4 rounded-lg border border-dashed border-surface-300 hover:border-solid hover:bg-emphasis dark:border-surface-500 transition-colors"
41
- >
42
- <div
43
- *cdkDragPlaceholder
44
- class="col-span-12 min-h-27 w-full rounded-2xl bg-black/10 z-1"
45
- ></div>
46
- <span class="flex-1 text-base font-medium">{{
47
- node.name
48
- }}</span>
49
- </div>
50
- }
51
-
52
- @if (tab.properties.length === 0) {
53
- <div class="py-8 text-center text-muted-color">
54
- <p class="text-sm">
55
- All {{ tab.title }} items are in use
56
- </p>
57
- </div>
58
- }
59
- </div>
60
- </p-tabpanel>
61
- }
62
- </p-tabpanels>
63
- </p-tabs>
64
- </ng-template>
65
- </mt-card>
66
- }
67
-
68
- <!-- Main Canvas Area -->
69
- <div class="flex flex-col gap-4 flex-1 w-full h-full overflow-y-auto">
70
- <mt-card>
71
- <ng-template #headless>
72
- <div class="p-4 flex items-center gap-2">
73
- <mt-button
74
- icon="layout.layout-top"
75
- [label]="t('add-section')"
76
- (onClick)="addSection()"
77
- ></mt-button>
78
- <mt-button
79
- icon="general.eye"
80
- [label]="t('preview')"
81
- (onClick)="openPreview()"
82
- ></mt-button>
83
- <mt-button
84
- icon="finance.credit-card-plus"
85
- [label]="t('reset')"
86
- (onClick)="resetFormConfiguration()"
87
- ></mt-button>
88
- </div>
89
- </ng-template>
90
- </mt-card>
91
- @for (section of enrichedSections(); track section.id) {
92
- <mt-fb-section
93
- [section]="section"
94
- [sectionsCount]="enrichedSections().length"
95
- [allSections]="enrichedSections()"
96
- (onFieldDrop)="drop($event)"
97
- >
98
- </mt-fb-section>
99
- } @empty {
100
- <mt-card>
101
- <div class="h-27 p-4">
102
- <div
103
- class="flex justify-center items-center gap-4 h-full border-2 border-primary rounded-xl bg-primary-200 text-primary"
104
- >
105
- <span>{{ t("no-section") }}</span>
106
- </div>
107
- </div>
108
- </mt-card>
109
- }
110
- </div>
111
- </div>
112
- </ng-container>
@@ -1,60 +0,0 @@
1
- import type { FieldType } from '@masterteam/components';
2
- import type {
3
- FormField as BaseFormField,
4
- FormSection as BaseFormSection,
5
- FieldWidth,
6
- } from '../store/form-builder/form-builder.model';
7
-
8
- export type { FieldType, FieldWidth };
9
-
10
- // Re-export base types
11
- export type FormField = BaseFormField;
12
- export type FormSection = BaseFormSection;
13
-
14
- // Enriched field with UI properties (from PropertyItem)
15
- export interface EnrichedFormField extends BaseFormField {
16
- name: string;
17
- type: string;
18
- data?: any;
19
- _pending?: boolean; // Optimistic: field is being added
20
- _deleting?: boolean; // Optimistic: field is being deleted
21
- }
22
-
23
- // Enriched section for UI display
24
- export interface EnrichedFormSection extends Omit<BaseFormSection, 'fields'> {
25
- fields: EnrichedFormField[];
26
- }
27
- export interface PropertyItem {
28
- id: number;
29
- key: string;
30
- normalizedKey: string;
31
- viewType: string;
32
- viewTypeLabel: string;
33
- name: string | Record<string, string>;
34
- description?: string;
35
- defaultValue?: unknown;
36
- order?: number;
37
- canBeDeleted?: boolean;
38
- displayOverView?: boolean;
39
- enabled?: boolean;
40
- formula?: unknown[];
41
- isBasic?: boolean;
42
- isCalculated?: boolean;
43
- isConfigurable?: boolean;
44
- isHiddenInCreation?: boolean;
45
- isHiddenInEdition?: boolean;
46
- isLive?: boolean;
47
- isLog?: boolean;
48
- isRequired?: boolean;
49
- isSystem?: boolean;
50
- isTranslatable?: boolean;
51
- shownInTable?: boolean;
52
- includeInSummary?: boolean;
53
- dependsOn?: unknown[];
54
- isFilterFormula?: boolean;
55
- configuration?: Record<string, unknown>;
56
- category?: string;
57
- valueOnCreation?: boolean;
58
- isRelated?: boolean;
59
- [key: string]: unknown;
60
- }
@@ -1,20 +0,0 @@
1
- // Drag & Drop Cursor Styles
2
- .cdk-drag {
3
- cursor: grab;
4
-
5
- &:active {
6
- cursor: grabbing;
7
- }
8
- }
9
-
10
- .cdk-drag-preview {
11
- cursor: grabbing;
12
- }
13
-
14
- .cdk-drag-placeholder {
15
- opacity: 0.5;
16
- }
17
-
18
- .cdk-drop-list-dragging .cdk-drag {
19
- cursor: grabbing;
20
- }