intelliwaketssveltekitv25 1.0.63 → 1.0.65
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/dist/AccordianSelect.svelte +1 -0
- package/dist/DateRangePicker.svelte +4 -1
- package/dist/FunctionsBrowser.svelte.d.ts +10 -0
- package/dist/FunctionsBrowser.svelte.js +29 -0
- package/dist/Icon.svelte +1 -1
- package/dist/Importer.svelte +35 -0
- package/dist/Importer.svelte.d.ts +34 -0
- package/dist/ImporterAnalysis.svelte +188 -0
- package/dist/ImporterAnalysis.svelte.d.ts +31 -0
- package/dist/ImporterLoad.svelte +179 -0
- package/dist/ImporterLoad.svelte.d.ts +33 -0
- package/dist/InputNumberScroll.svelte +1 -0
- package/dist/MasterDetailLayout.svelte +1 -1
- package/dist/Modal.svelte +3 -3
- package/dist/Modal.svelte.d.ts +2 -2
- package/dist/ModalFormAction.svelte +2 -1
- package/dist/ModalFormAction.svelte.d.ts +1 -1
- package/dist/ModalPromptControl.svelte +2 -1
- package/dist/Paginator.svelte +2 -1
- package/dist/SwitchDateNull.svelte +1 -1
- package/dist/TabHeader.svelte +1 -0
- package/dist/TextArea.svelte +2 -1
- package/dist/app.css +1 -1
- package/dist/index.d.ts +41 -78
- package/dist/index.js +41 -78
- package/package.json +8 -6
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { CustomRangeName, DefaultRangeStringsReport, type TDateRangeString } from './DateRangeFunctions'
|
|
3
|
-
import { CookieCreate, DropDownControl, ListGroupItems, type TListGroupItem } from './index'
|
|
4
3
|
import Calendar from './Calendar.svelte'
|
|
5
4
|
import { DateCompare, DateOnly, ToArray } from '@solidbasisventures/intelliwaketsfoundation'
|
|
6
5
|
import { invalidate as doInvalidate, invalidateAll } from '$app/navigation'
|
|
6
|
+
import type { TListGroupItem } from './Definitions'
|
|
7
|
+
import { CookieCreate } from './Cookie'
|
|
8
|
+
import DropDownControl from './DropDownControl.svelte'
|
|
9
|
+
import ListGroupItems from './ListGroupItems.svelte'
|
|
7
10
|
|
|
8
11
|
let {
|
|
9
12
|
dateRange = $bindable(),
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts Data to CSV. Creates a download link and triggers
|
|
3
|
+
* click event on it to download the file.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DataToCSVExport: (filename: string, csvData: string[][], blankZeros?: boolean) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Converts Data to CSV without quotes. Creates a download link and triggers
|
|
8
|
+
* click event on it to download the file.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DataToCSVExportNoQuotes: (filename: string, csvData: string[][]) => void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DataToCSVString } from '@solidbasisventures/intelliwaketsfoundation';
|
|
2
|
+
/**
|
|
3
|
+
* Converts Data to CSV. Creates a download link and triggers
|
|
4
|
+
* click event on it to download the file.
|
|
5
|
+
*/
|
|
6
|
+
export const DataToCSVExport = function (filename, csvData, blankZeros = true) {
|
|
7
|
+
const csvString = DataToCSVString(csvData, blankZeros);
|
|
8
|
+
const pom = document.createElement('a');
|
|
9
|
+
const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8;' });
|
|
10
|
+
pom.href = URL.createObjectURL(blob);
|
|
11
|
+
pom.setAttribute('download', filename);
|
|
12
|
+
pom.click();
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Converts Data to CSV without quotes. Creates a download link and triggers
|
|
16
|
+
* click event on it to download the file.
|
|
17
|
+
*/
|
|
18
|
+
export const DataToCSVExportNoQuotes = function (filename, csvData) {
|
|
19
|
+
const csvString = csvData
|
|
20
|
+
.map((row) => row
|
|
21
|
+
.map((item) => !!item && !isNaN(Number(item)) ? Math.round(Number(item) * 100) / 100 : (item ?? ''))
|
|
22
|
+
.join(','))
|
|
23
|
+
.join('\n');
|
|
24
|
+
const pom = document.createElement('a');
|
|
25
|
+
const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8;' });
|
|
26
|
+
pom.href = URL.createObjectURL(blob);
|
|
27
|
+
pom.setAttribute('download', filename);
|
|
28
|
+
pom.click();
|
|
29
|
+
};
|
package/dist/Icon.svelte
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends TDataImportProcessorDefinition<any>">
|
|
2
|
+
import {
|
|
3
|
+
type TDataImportProcessorDefinition,
|
|
4
|
+
type TDataImportProcessorResult
|
|
5
|
+
} from '@solidbasisventures/intelliwaketsfoundation'
|
|
6
|
+
import ImporterAnalysis from './ImporterAnalysis.svelte'
|
|
7
|
+
import ImporterLoad from './ImporterLoad.svelte'
|
|
8
|
+
import type { Snippet } from 'svelte'
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
definition,
|
|
12
|
+
alternateNames = $bindable(),
|
|
13
|
+
csvData = $bindable(null),
|
|
14
|
+
arrayData = $bindable(null),
|
|
15
|
+
onprocess,
|
|
16
|
+
description,
|
|
17
|
+
currentData
|
|
18
|
+
}: {
|
|
19
|
+
definition: T & TDataImportProcessorDefinition<any>,
|
|
20
|
+
alternateNames?: Record<string, string[]>,
|
|
21
|
+
csvData?: string | null,
|
|
22
|
+
arrayData?: string[][] | null,
|
|
23
|
+
onprocess?: (results: TDataImportProcessorResult<T['columns']>[]) => Promise<boolean>,
|
|
24
|
+
description?: Snippet,
|
|
25
|
+
currentData?: object[]
|
|
26
|
+
} = $props()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
{#if csvData === null && arrayData === null}
|
|
32
|
+
<ImporterLoad {definition} {description} {currentData} bind:csvData />
|
|
33
|
+
{:else}
|
|
34
|
+
<ImporterAnalysis {definition} bind:alternateNames {onprocess} bind:csvData bind:arrayData />
|
|
35
|
+
{/if}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type TDataImportProcessorDefinition, type TDataImportProcessorResult } from '@solidbasisventures/intelliwaketsfoundation';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
declare function $$render<T extends TDataImportProcessorDefinition<any>>(): {
|
|
4
|
+
props: {
|
|
5
|
+
definition: T & TDataImportProcessorDefinition<any>;
|
|
6
|
+
alternateNames?: Record<string, string[]>;
|
|
7
|
+
csvData?: string | null;
|
|
8
|
+
arrayData?: string[][] | null;
|
|
9
|
+
onprocess?: (results: TDataImportProcessorResult<T["columns"]>[]) => Promise<boolean>;
|
|
10
|
+
description?: Snippet;
|
|
11
|
+
currentData?: object[];
|
|
12
|
+
};
|
|
13
|
+
exports: {};
|
|
14
|
+
bindings: "arrayData" | "alternateNames" | "csvData";
|
|
15
|
+
slots: {};
|
|
16
|
+
events: {};
|
|
17
|
+
};
|
|
18
|
+
declare class __sveltets_Render<T extends TDataImportProcessorDefinition<any>> {
|
|
19
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
20
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
21
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
22
|
+
bindings(): "arrayData" | "alternateNames" | "csvData";
|
|
23
|
+
exports(): {};
|
|
24
|
+
}
|
|
25
|
+
interface $$IsomorphicComponent {
|
|
26
|
+
new <T extends TDataImportProcessorDefinition<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']>> & {
|
|
27
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
28
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
29
|
+
<T extends TDataImportProcessorDefinition<any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
30
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
31
|
+
}
|
|
32
|
+
declare const Importer: $$IsomorphicComponent;
|
|
33
|
+
type Importer<T extends TDataImportProcessorDefinition<any>> = InstanceType<typeof Importer<T>>;
|
|
34
|
+
export default Importer;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends TDataImportProcessorDefinition<any>">
|
|
2
|
+
import {
|
|
3
|
+
AddS,
|
|
4
|
+
CleanNumbers,
|
|
5
|
+
CoalesceFalsey,
|
|
6
|
+
DataImportProcessor,
|
|
7
|
+
ObjectKeys,
|
|
8
|
+
SetAlternateNames,
|
|
9
|
+
type TDataImportProcessorDefinition,
|
|
10
|
+
type TDataImportProcessorResult
|
|
11
|
+
} from '@solidbasisventures/intelliwaketsfoundation'
|
|
12
|
+
import DropDown from './DropDown.svelte'
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
definition,
|
|
16
|
+
alternateNames = $bindable(),
|
|
17
|
+
csvData = $bindable(null),
|
|
18
|
+
arrayData = $bindable(null),
|
|
19
|
+
onprocess
|
|
20
|
+
}: {
|
|
21
|
+
definition: T & TDataImportProcessorDefinition<any>,
|
|
22
|
+
alternateNames?: Record<string, string[]>,
|
|
23
|
+
csvData?: string | null,
|
|
24
|
+
arrayData?: string[][] | null,
|
|
25
|
+
onprocess?: (results: TDataImportProcessorResult<T['columns']>[]) => Promise<boolean>
|
|
26
|
+
} = $props()
|
|
27
|
+
|
|
28
|
+
let filter = $state<'errors' | 'warnings' | null>(null)
|
|
29
|
+
|
|
30
|
+
let importer = $derived.by(() => {
|
|
31
|
+
if (csvData) {
|
|
32
|
+
const dip = new DataImportProcessor(definition.columns, { alternateNames })
|
|
33
|
+
dip.populateFromCSV(csvData)
|
|
34
|
+
return dip
|
|
35
|
+
}
|
|
36
|
+
if (arrayData) {
|
|
37
|
+
const dip = new DataImportProcessor(definition.columns, { alternateNames })
|
|
38
|
+
dip.populateFromArray(arrayData)
|
|
39
|
+
return dip
|
|
40
|
+
}
|
|
41
|
+
return null
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
let errorCount = $derived(CleanNumbers(0, importer?.allErrors.length, importer?.missingRequiredHeaders?.length))
|
|
45
|
+
let warningCount = $derived(importer?.allWarnings.length ?? 0)
|
|
46
|
+
|
|
47
|
+
let useFilter = $derived((filter === 'errors' && errorCount) ? filter :
|
|
48
|
+
(filter === 'warnings' && warningCount) ? filter :
|
|
49
|
+
null)
|
|
50
|
+
|
|
51
|
+
let analysisRows = $derived((importer?.analysisRows ?? [])
|
|
52
|
+
.filter(row => !useFilter ||
|
|
53
|
+
(useFilter === 'errors' && row.columns.some(col => col.errorMessage)) ||
|
|
54
|
+
(useFilter === 'warnings' && row.columns.some(col => col.warningMessage))))
|
|
55
|
+
|
|
56
|
+
async function doProcess() {
|
|
57
|
+
if (importer && onprocess) {
|
|
58
|
+
if (await onprocess(importer.validRows)) {
|
|
59
|
+
doClear()
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function doClear() {
|
|
65
|
+
if (csvData) csvData = null
|
|
66
|
+
if (arrayData) arrayData = null
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let definitionKeys = $derived(ObjectKeys(definition.columns))
|
|
70
|
+
|
|
71
|
+
function setAlternateName(providedColumn: string | null, targetColumn: string | null) {
|
|
72
|
+
if (!providedColumn || !alternateNames) return
|
|
73
|
+
|
|
74
|
+
alternateNames = SetAlternateNames(alternateNames, providedColumn, targetColumn)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
</script>
|
|
78
|
+
|
|
79
|
+
<div class="grid grid-rows-[auto_1fr] overflow-hidden">
|
|
80
|
+
<div class="grid grid-cols-[1fr_auto]">
|
|
81
|
+
<div class="flex flex-row flex-wrap gap-2 p-2 [&>*]:w-36 [&>*]:font-bold">
|
|
82
|
+
{#if errorCount}
|
|
83
|
+
<button data-color="danger"
|
|
84
|
+
onclick={() => filter = filter === 'errors' ? null : 'errors'}
|
|
85
|
+
class:opacity-50={useFilter && useFilter !== 'errors'}>
|
|
86
|
+
{AddS('Error', errorCount, true)}
|
|
87
|
+
</button>
|
|
88
|
+
{/if}
|
|
89
|
+
{#if warningCount}
|
|
90
|
+
<button data-color="warning"
|
|
91
|
+
onclick={() => filter = filter === 'warnings' ? null : 'warnings'}
|
|
92
|
+
class:opacity-50={useFilter && useFilter !== 'warnings'}>
|
|
93
|
+
{AddS('Warning', warningCount, true)}
|
|
94
|
+
</button>
|
|
95
|
+
{/if}
|
|
96
|
+
</div>
|
|
97
|
+
<div class="p-2">
|
|
98
|
+
<div class="flex flex-row justify-end gap-2">
|
|
99
|
+
<button type="button" onclick={doClear}
|
|
100
|
+
class="border-transparent bg-transparent text-slate-300 hover:text-slate-400 focus:ring-transparent shadow-none">
|
|
101
|
+
Clear Data
|
|
102
|
+
</button>
|
|
103
|
+
<button type="button" onclick={doProcess} disabled={!importer?.isValid}>
|
|
104
|
+
Import
|
|
105
|
+
</button>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="overflow-auto text-sm">
|
|
110
|
+
{#if !importer?.analysisRows?.length}
|
|
111
|
+
<div class="text-center mt-8 text-slate-400">
|
|
112
|
+
No rows to import
|
|
113
|
+
</div>
|
|
114
|
+
{:else}
|
|
115
|
+
{@const headerRow = importer.analysisRows[0]}
|
|
116
|
+
<table class="table tableBordered tableSticky">
|
|
117
|
+
<thead>
|
|
118
|
+
<tr>
|
|
119
|
+
{#each importer?.missingRequiredHeaders ?? [] as missingRequiredHeader}
|
|
120
|
+
<th data-color-light="danger">
|
|
121
|
+
{missingRequiredHeader}
|
|
122
|
+
<br />
|
|
123
|
+
<span class="font-normal">(Missing)</span>
|
|
124
|
+
</th>
|
|
125
|
+
{/each}
|
|
126
|
+
{#each headerRow.columns as column}
|
|
127
|
+
<th>
|
|
128
|
+
<div class="font-normal">
|
|
129
|
+
<DropDown ddActions={[
|
|
130
|
+
{
|
|
131
|
+
dividerGroup: 'Reset',
|
|
132
|
+
title: '(Reset)',
|
|
133
|
+
action: () => setAlternateName(column.rawHeader, null)
|
|
134
|
+
},
|
|
135
|
+
...definitionKeys.map(dk => ({
|
|
136
|
+
dividerGroup: 'Keys',
|
|
137
|
+
title: dk,
|
|
138
|
+
action: () => setAlternateName(column.rawHeader, dk),
|
|
139
|
+
active: dk === column.columnKey
|
|
140
|
+
}))
|
|
141
|
+
]}
|
|
142
|
+
buttonClass="btnText"
|
|
143
|
+
buttonTitle={CoalesceFalsey(column.columnKey, '(Not Mapped)')} />
|
|
144
|
+
</div>
|
|
145
|
+
{#if column.columnKey !== column.rawHeader}
|
|
146
|
+
<div class="font-normal">{column.rawHeader}</div>
|
|
147
|
+
{/if}
|
|
148
|
+
</th>
|
|
149
|
+
{/each}
|
|
150
|
+
</tr>
|
|
151
|
+
</thead>
|
|
152
|
+
<tbody>
|
|
153
|
+
{#each analysisRows as row}
|
|
154
|
+
<tr>
|
|
155
|
+
{#each importer?.missingRequiredHeaders ?? [] as missingRequiredHeader}
|
|
156
|
+
<td data-color-light="danger">
|
|
157
|
+
</td>
|
|
158
|
+
{/each}
|
|
159
|
+
{#each row.columns as column}
|
|
160
|
+
<td
|
|
161
|
+
data-color-light={column.errorMessage ? 'danger' :
|
|
162
|
+
column.warningMessage ? 'warning' :
|
|
163
|
+
!column.columnDefinition ? 'gray' : undefined}>
|
|
164
|
+
<div class:text-left={column.justify === 'left'}
|
|
165
|
+
class:text-center={column.justify === 'center'}
|
|
166
|
+
class:text-right={column.justify === 'right'}
|
|
167
|
+
class="text-black">
|
|
168
|
+
{#if column.displayValue}
|
|
169
|
+
{column.displayValue}
|
|
170
|
+
{:else}
|
|
171
|
+
|
|
172
|
+
{/if}
|
|
173
|
+
</div>
|
|
174
|
+
{#if column.errorMessage}
|
|
175
|
+
<div class="text-xs">{column.errorMessage}</div>
|
|
176
|
+
{/if}
|
|
177
|
+
{#if column.warningMessage}
|
|
178
|
+
<div class="text-xs">{column.warningMessage}</div>
|
|
179
|
+
{/if}
|
|
180
|
+
</td>
|
|
181
|
+
{/each}
|
|
182
|
+
</tr>
|
|
183
|
+
{/each}
|
|
184
|
+
</tbody>
|
|
185
|
+
</table>
|
|
186
|
+
{/if}
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type TDataImportProcessorDefinition, type TDataImportProcessorResult } from '@solidbasisventures/intelliwaketsfoundation';
|
|
2
|
+
declare function $$render<T extends TDataImportProcessorDefinition<any>>(): {
|
|
3
|
+
props: {
|
|
4
|
+
definition: T & TDataImportProcessorDefinition<any>;
|
|
5
|
+
alternateNames?: Record<string, string[]>;
|
|
6
|
+
csvData?: string | null;
|
|
7
|
+
arrayData?: string[][] | null;
|
|
8
|
+
onprocess?: (results: TDataImportProcessorResult<T["columns"]>[]) => Promise<boolean>;
|
|
9
|
+
};
|
|
10
|
+
exports: {};
|
|
11
|
+
bindings: "arrayData" | "alternateNames" | "csvData";
|
|
12
|
+
slots: {};
|
|
13
|
+
events: {};
|
|
14
|
+
};
|
|
15
|
+
declare class __sveltets_Render<T extends TDataImportProcessorDefinition<any>> {
|
|
16
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
17
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
18
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
19
|
+
bindings(): "arrayData" | "alternateNames" | "csvData";
|
|
20
|
+
exports(): {};
|
|
21
|
+
}
|
|
22
|
+
interface $$IsomorphicComponent {
|
|
23
|
+
new <T extends TDataImportProcessorDefinition<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']>> & {
|
|
24
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
25
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
+
<T extends TDataImportProcessorDefinition<any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
27
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
28
|
+
}
|
|
29
|
+
declare const ImporterAnalysis: $$IsomorphicComponent;
|
|
30
|
+
type ImporterAnalysis<T extends TDataImportProcessorDefinition<any>> = InstanceType<typeof ImporterAnalysis<T>>;
|
|
31
|
+
export default ImporterAnalysis;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends TDataImportProcessorDefinition<any>">
|
|
2
|
+
import {
|
|
3
|
+
ObjectKeys,
|
|
4
|
+
type TDataImportProcessorDefinition,
|
|
5
|
+
ToArray,
|
|
6
|
+
YYYY_MM_DD_HH_mm_ss
|
|
7
|
+
} from '@solidbasisventures/intelliwaketsfoundation'
|
|
8
|
+
import DisplayHTML from './DisplayHTML.svelte'
|
|
9
|
+
import type { Snippet } from 'svelte'
|
|
10
|
+
import DropDown from './DropDown.svelte'
|
|
11
|
+
import type { IDDAction } from './Definitions'
|
|
12
|
+
import { DataToCSVExport } from './FunctionsBrowser.svelte'
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
definition,
|
|
16
|
+
description,
|
|
17
|
+
currentData,
|
|
18
|
+
templateName = 'Template',
|
|
19
|
+
fileAccept = '.csv',
|
|
20
|
+
csvData = $bindable(null)
|
|
21
|
+
}: {
|
|
22
|
+
definition: T & TDataImportProcessorDefinition<any>,
|
|
23
|
+
description?: Snippet,
|
|
24
|
+
currentData?: object[],
|
|
25
|
+
templateName?: string,
|
|
26
|
+
fileAccept?: string,
|
|
27
|
+
csvData?: string | null,
|
|
28
|
+
} = $props()
|
|
29
|
+
|
|
30
|
+
let fileUploader = $state<HTMLInputElement | null>(null)
|
|
31
|
+
|
|
32
|
+
let columnEntries = $derived(Object.entries(definition.columns).map(ent => ({ key: ent[0], value: ent[1] })))
|
|
33
|
+
|
|
34
|
+
let hasDescriptions = $derived(columnEntries.some(ce => ce.value.description))
|
|
35
|
+
let hasSamples = $derived(columnEntries.some(ce => ce.value.sampleData))
|
|
36
|
+
|
|
37
|
+
let isDragging = $state(false)
|
|
38
|
+
|
|
39
|
+
let ddActions = $derived<IDDAction[]>([
|
|
40
|
+
{
|
|
41
|
+
title: 'Download Empty Template',
|
|
42
|
+
action: () => {
|
|
43
|
+
DataToCSVExport(`${templateName}_${YYYY_MM_DD_HH_mm_ss('now')}.csv`, [
|
|
44
|
+
columnEntries.map(ce => ce.key)
|
|
45
|
+
])
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: 'Download with Sample Data',
|
|
50
|
+
hidden: !hasDescriptions && !hasSamples,
|
|
51
|
+
action: () => {
|
|
52
|
+
const data = [columnEntries.map(ce => ce.key)]
|
|
53
|
+
if (hasDescriptions) data.push(columnEntries.map(ce => ce.value.description ?? ''))
|
|
54
|
+
if (hasSamples) data.push(columnEntries.map(ce => ToArray(ce.value.sampleData ?? '').join(', ')))
|
|
55
|
+
DataToCSVExport(`${templateName}_${YYYY_MM_DD_HH_mm_ss('now')}.csv`, data)
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
title: 'Download Current Data',
|
|
60
|
+
hidden: !currentData?.length,
|
|
61
|
+
action: () => {
|
|
62
|
+
const keys = ObjectKeys((currentData ?? [])[0])
|
|
63
|
+
const data: any[] = [keys]
|
|
64
|
+
const rows = currentData?.map(project => Object.values(project).map(val => val?.toString())) ?? []
|
|
65
|
+
data.push(...rows)
|
|
66
|
+
DataToCSVExport(`${templateName}_${YYYY_MM_DD_HH_mm_ss('now')}.csv`, data)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
])
|
|
70
|
+
|
|
71
|
+
async function doLoadFile(e: any) {
|
|
72
|
+
const file = (e.target?.files ?? [])[0]
|
|
73
|
+
|
|
74
|
+
csvData = await file?.text() ?? null
|
|
75
|
+
|
|
76
|
+
if (fileUploader) {
|
|
77
|
+
fileUploader.value = ''
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function onDrop(e: DragEvent) {
|
|
82
|
+
e.preventDefault()
|
|
83
|
+
isDragging = false
|
|
84
|
+
const file = e.dataTransfer?.files?.[0]
|
|
85
|
+
if (file) {
|
|
86
|
+
csvData = await file.text()
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<div class="grid grid-rows-[auto_auto_auto_1fr] overflow-hidden gap-2"
|
|
92
|
+
role="region"
|
|
93
|
+
aria-label="File drop zone"
|
|
94
|
+
class:bg-blue-50={isDragging}
|
|
95
|
+
ondragover={(e) => { e.preventDefault(); isDragging = true }}
|
|
96
|
+
ondragleave={() => isDragging = false}
|
|
97
|
+
ondrop={onDrop}>
|
|
98
|
+
<div>
|
|
99
|
+
{@render description?.()}
|
|
100
|
+
<DisplayHTML value={definition.descriptionHTML} />
|
|
101
|
+
</div>
|
|
102
|
+
<div class="grid grid-cols-2">
|
|
103
|
+
<div>
|
|
104
|
+
<button type="button"
|
|
105
|
+
onclick={() => { fileUploader?.click() }}>
|
|
106
|
+
<svg aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg"
|
|
107
|
+
class="svelte-fa svelte-fa-base svelte-fa-fw" viewBox="0 0 512 512"
|
|
108
|
+
style="height: 1em; overflow: visible; transform-origin: center center; vertical-align: -0.125em; text-align: center; width: 1.25em;">
|
|
109
|
+
<g transform="translate(256 256)" transform-origin="128 0">
|
|
110
|
+
<g transform="translate(0,0) scale(1,1)">
|
|
111
|
+
<path
|
|
112
|
+
d="M280 360c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-278.1-95 95c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9L239 7c9.4-9.4 24.6-9.4 33.9 0L409 143c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-95-95L280 360zm32-8l0-48 136 0c35.3 0 64 28.7 64 64l0 80c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64l0-80c0-35.3 28.7-64 64-64l136 0 0 48L64 352c-8.8 0-16 7.2-16 16l0 80c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-80c0-8.8-7.2-16-16-16l-136 0zm72 56a24 24 0 1 1 48 0 24 24 0 1 1 -48 0z"
|
|
113
|
+
fill="currentColor" transform="translate(-256 -256)"></path>
|
|
114
|
+
</g>
|
|
115
|
+
</g>
|
|
116
|
+
</svg>
|
|
117
|
+
Import CSV
|
|
118
|
+
</button>
|
|
119
|
+
<input type="file"
|
|
120
|
+
hidden
|
|
121
|
+
accept={fileAccept}
|
|
122
|
+
multiple={false}
|
|
123
|
+
bind:this={fileUploader}
|
|
124
|
+
onchange={doLoadFile} />
|
|
125
|
+
</div>
|
|
126
|
+
<div class="text-right">
|
|
127
|
+
<DropDown {ddActions}>
|
|
128
|
+
{#snippet button()}
|
|
129
|
+
<svg aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg"
|
|
130
|
+
class="svelte-fa svelte-fa-base svelte-fa-fw" viewBox="0 0 512 512"
|
|
131
|
+
style="height: 1em; overflow: visible; transform-origin: center center; vertical-align: -0.125em; text-align: center; width: 1.25em;">
|
|
132
|
+
<g transform="translate(256 256)" transform-origin="128 0">
|
|
133
|
+
<g transform="translate(0,0) scale(1,1)">
|
|
134
|
+
<path
|
|
135
|
+
d="M280 24c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 270.1-95-95c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9L239 369c9.4 9.4 24.6 9.4 33.9 0L409 233c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-95 95L280 24zM128.8 304L64 304c-35.3 0-64 28.7-64 64l0 80c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-80c0-35.3-28.7-64-64-64l-64.8 0-48 48L448 352c8.8 0 16 7.2 16 16l0 80c0 8.8-7.2 16-16 16L64 464c-8.8 0-16-7.2-16-16l0-80c0-8.8 7.2-16 16-16l112.8 0-48-48zM432 408a24 24 0 1 0 -48 0 24 24 0 1 0 48 0z"
|
|
136
|
+
fill="currentColor" transform="translate(-256 -256)"></path>
|
|
137
|
+
</g>
|
|
138
|
+
</g>
|
|
139
|
+
</svg>
|
|
140
|
+
CSV Template
|
|
141
|
+
{/snippet}
|
|
142
|
+
</DropDown>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<div>The CSV will import data based on the headers in the first row as follows:</div>
|
|
146
|
+
<div class="overflow-auto text-sm">
|
|
147
|
+
<table class="table tableBordered tableSticky">
|
|
148
|
+
<thead>
|
|
149
|
+
<tr>
|
|
150
|
+
{#each columnEntries as column}
|
|
151
|
+
<th>
|
|
152
|
+
{column.key}
|
|
153
|
+
</th>
|
|
154
|
+
{/each}
|
|
155
|
+
</tr>
|
|
156
|
+
</thead>
|
|
157
|
+
<tbody>
|
|
158
|
+
{#if hasDescriptions}
|
|
159
|
+
<tr>
|
|
160
|
+
{#each columnEntries as column}
|
|
161
|
+
<td>
|
|
162
|
+
{column.value.description ?? ''}
|
|
163
|
+
</td>
|
|
164
|
+
{/each}
|
|
165
|
+
</tr>
|
|
166
|
+
{/if}
|
|
167
|
+
{#if hasSamples}
|
|
168
|
+
<tr>
|
|
169
|
+
{#each columnEntries as column}
|
|
170
|
+
<td>
|
|
171
|
+
{ToArray(column.value.sampleData ?? '').join(', ')}
|
|
172
|
+
</td>
|
|
173
|
+
{/each}
|
|
174
|
+
</tr>
|
|
175
|
+
{/if}
|
|
176
|
+
</tbody>
|
|
177
|
+
</table>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type TDataImportProcessorDefinition } from '@solidbasisventures/intelliwaketsfoundation';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
declare function $$render<T extends TDataImportProcessorDefinition<any>>(): {
|
|
4
|
+
props: {
|
|
5
|
+
definition: T & TDataImportProcessorDefinition<any>;
|
|
6
|
+
description?: Snippet;
|
|
7
|
+
currentData?: object[];
|
|
8
|
+
templateName?: string;
|
|
9
|
+
fileAccept?: string;
|
|
10
|
+
csvData?: string | null;
|
|
11
|
+
};
|
|
12
|
+
exports: {};
|
|
13
|
+
bindings: "csvData";
|
|
14
|
+
slots: {};
|
|
15
|
+
events: {};
|
|
16
|
+
};
|
|
17
|
+
declare class __sveltets_Render<T extends TDataImportProcessorDefinition<any>> {
|
|
18
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
19
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
20
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
21
|
+
bindings(): "csvData";
|
|
22
|
+
exports(): {};
|
|
23
|
+
}
|
|
24
|
+
interface $$IsomorphicComponent {
|
|
25
|
+
new <T extends TDataImportProcessorDefinition<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']>> & {
|
|
26
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
27
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
28
|
+
<T extends TDataImportProcessorDefinition<any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
29
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
30
|
+
}
|
|
31
|
+
declare const ImporterLoad: $$IsomorphicComponent;
|
|
32
|
+
type ImporterLoad<T extends TDataImportProcessorDefinition<any>> = InstanceType<typeof ImporterLoad<T>>;
|
|
33
|
+
export default ImporterLoad;
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
allowManualEntryMode = true,
|
|
29
29
|
saveManualEntryMode = null,
|
|
30
30
|
readonly = false,
|
|
31
|
+
// svelte-ignore state_referenced_locally
|
|
31
32
|
manualEntryMode = allowManualEntryMode && !!saveManualEntryMode && browser && IsOn(window.localStorage.getItem(saveManualEntryMode)),
|
|
32
33
|
/**
|
|
33
34
|
* Maximum number of digits allowed for manual entry.
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
import { type TFindIsActive, ToPascalCase } from '@solidbasisventures/intelliwaketsfoundation'
|
|
7
7
|
import { PathAnalyzer } from './PathAnalyzer'
|
|
8
8
|
import { onDestroy, type Snippet } from 'svelte'
|
|
9
|
-
import { Icon } from './index'
|
|
10
9
|
import { BreakAtManager, type TBreakAt } from './BreakAtManager.js'
|
|
10
|
+
import Icon from './Icon.svelte'
|
|
11
11
|
|
|
12
12
|
let {
|
|
13
13
|
pageRoute,
|
package/dist/Modal.svelte
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import ActivityOverlay from './ActivityOverlay.svelte'
|
|
12
12
|
import { CleanNumber } from '@solidbasisventures/intelliwaketsfoundation'
|
|
13
13
|
import { type IFAProps, ShowActivityOverlay } from './Definitions'
|
|
14
|
-
import
|
|
14
|
+
import Icon from './Icon.svelte'
|
|
15
15
|
|
|
16
16
|
let {
|
|
17
17
|
header,
|
|
@@ -73,8 +73,8 @@
|
|
|
73
73
|
marginForStickyHeader?: boolean
|
|
74
74
|
okButtonWrap?: boolean
|
|
75
75
|
class?: string
|
|
76
|
-
okColor?: TDefaultColorPalate
|
|
77
|
-
color?: TDefaultColorPalate
|
|
76
|
+
okColor?: TDefaultColorPalate | null
|
|
77
|
+
color?: TDefaultColorPalate | null
|
|
78
78
|
classHeader?: string
|
|
79
79
|
classBody?: string
|
|
80
80
|
classFooter?: string
|
package/dist/Modal.svelte.d.ts
CHANGED
|
@@ -24,8 +24,8 @@ type $$ComponentProps = {
|
|
|
24
24
|
marginForStickyHeader?: boolean;
|
|
25
25
|
okButtonWrap?: boolean;
|
|
26
26
|
class?: string;
|
|
27
|
-
okColor?: TDefaultColorPalate;
|
|
28
|
-
color?: TDefaultColorPalate;
|
|
27
|
+
okColor?: TDefaultColorPalate | null;
|
|
28
|
+
color?: TDefaultColorPalate | null;
|
|
29
29
|
classHeader?: string;
|
|
30
30
|
classBody?: string;
|
|
31
31
|
classFooter?: string;
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { FormEnhance } from './FormEnhance'
|
|
6
6
|
import { enhance } from '$app/forms'
|
|
7
7
|
import { CleanNumber } from '@solidbasisventures/intelliwaketsfoundation'
|
|
8
|
-
import {
|
|
8
|
+
import type { IFAProps } from './Definitions'
|
|
9
|
+
import Icon from './Icon.svelte'
|
|
9
10
|
|
|
10
11
|
let {
|
|
11
12
|
header,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { ModalPrompt } from './ModalPromptDefinition'
|
|
3
|
-
import {
|
|
3
|
+
import { Modal } from './index'
|
|
4
|
+
import Icon from './Icon.svelte'
|
|
4
5
|
|
|
5
6
|
let width = $derived($ModalPrompt?.size === 'sm' ? '20em' : $ModalPrompt?.size === 'lg' ? '30em' : $ModalPrompt?.size === 'xl' ? '35em' : '25em')
|
|
6
7
|
</script>
|