nuxt-ui-tools 1.11.2 → 1.13.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/README.md +11 -5
- package/dist/module.json +1 -1
- package/dist/module.mjs +46 -0
- package/dist/runtime/dashboard/components/dashboard-stat.d.vue.ts +1 -1
- package/dist/runtime/dashboard/components/dashboard-stat.vue.d.ts +1 -1
- package/dist/runtime/file-preview/components/shell/file-preview-stage.d.vue.ts +2 -2
- package/dist/runtime/file-preview/components/shell/file-preview-stage.vue.d.ts +2 -2
- package/dist/runtime/form/fields/array-collapse/component.vue +2 -1
- package/dist/runtime/form/fields/array-list/component.vue +72 -63
- package/dist/runtime/form/fields/array-list/use-array-items.d.ts +1 -0
- package/dist/runtime/form/fields/array-list/use-array-items.js +4 -0
- package/dist/runtime/form/fields/array-table/component.vue +2 -1
- package/dist/runtime/form/types/api.d.ts +10 -2
- package/dist/runtime/i18n/locales/en.js +252 -130
- package/dist/runtime/i18n/locales/fr.js +252 -130
- package/dist/runtime/i18n/types.d.ts +242 -119
- package/dist/runtime/shared/types/query.d.ts +14 -4
- package/dist/runtime/shared/types/remote-options.d.ts +11 -0
- package/dist/runtime/shared/utils/define-remote-options.js +6 -0
- package/dist/runtime/shared/utils/file.d.ts +1 -1
- package/dist/runtime/spreadsheet/components/{steps/review/spreadsheet-review-overflow-alert.d.vue.ts → internal/spreadsheet-import-cell-editor.d.vue.ts} +8 -5
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-cell-editor.vue +73 -0
- package/dist/runtime/spreadsheet/components/{steps/review/spreadsheet-review-overflow-alert.vue.d.ts → internal/spreadsheet-import-cell-editor.vue.d.ts} +8 -5
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-column-row.d.vue.ts +17 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-column-row.vue +98 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-column-row.vue.d.ts +17 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-heading.d.vue.ts +17 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-heading.vue +20 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-heading.vue.d.ts +17 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-status-badge.d.vue.ts +10 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-status-badge.vue +34 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-status-badge.vue.d.ts +10 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-value-row.d.vue.ts +13 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-value-row.vue +113 -0
- package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-value-row.vue.d.ts +13 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-column-mapping.d.vue.ts +35 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-column-mapping.vue +154 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-column-mapping.vue.d.ts +35 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-dropzone.d.vue.ts +23 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-dropzone.vue +83 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-dropzone.vue.d.ts +23 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-expected-columns.d.vue.ts +19 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-expected-columns.vue +45 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-expected-columns.vue.d.ts +19 -0
- package/dist/runtime/spreadsheet/components/{shared/spreadsheet-object-preview-table.d.vue.ts → parts/spreadsheet-import-export-button.d.vue.ts} +3 -2
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-export-button.vue +34 -0
- package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-file-bar.vue.d.ts → parts/spreadsheet-import-export-button.vue.d.ts} +3 -4
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-file-card.d.vue.ts +17 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-file-card.vue +49 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-file-card.vue.d.ts +17 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-progress.d.vue.ts +18 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-progress.vue +101 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-progress.vue.d.ts +18 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-row-inspector.d.vue.ts +22 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-row-inspector.vue +276 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-row-inspector.vue.d.ts +22 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-source-settings.d.vue.ts +11 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-source-settings.vue +164 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-source-settings.vue.d.ts +11 -0
- package/dist/runtime/spreadsheet/components/{shared/spreadsheet-value-preview.d.vue.ts → parts/spreadsheet-import-stat.d.vue.ts} +7 -4
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stat.vue +30 -0
- package/dist/runtime/spreadsheet/components/{shared/spreadsheet-value-preview.vue.d.ts → parts/spreadsheet-import-stat.vue.d.ts} +7 -4
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stats.d.vue.ts +26 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stats.vue +55 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stats.vue.d.ts +26 -0
- package/dist/runtime/spreadsheet/components/{shared/spreadsheet-object-preview-table.vue.d.ts → parts/spreadsheet-import-submit-button.d.vue.ts} +3 -2
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-submit-button.vue +27 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-submit-button.vue.d.ts +8 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-summary.d.vue.ts +16 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-summary.vue +51 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-summary.vue.d.ts +16 -0
- package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-file-bar.d.vue.ts → parts/spreadsheet-import-table-toolbar.d.vue.ts} +2 -4
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table-toolbar.vue +217 -0
- package/dist/runtime/spreadsheet/components/{shared/spreadsheet-raw-preview-table.d.vue.ts → parts/spreadsheet-import-table-toolbar.vue.d.ts} +2 -2
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table.d.vue.ts +33 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table.vue +302 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table.vue.d.ts +33 -0
- package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-sidebar.d.vue.ts → parts/spreadsheet-import-template-button.d.vue.ts} +5 -4
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-template-button.vue +31 -0
- package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-sidebar.vue.d.ts → parts/spreadsheet-import-template-button.vue.d.ts} +5 -4
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-value-mapping.d.vue.ts +27 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-value-mapping.vue +162 -0
- package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-value-mapping.vue.d.ts +27 -0
- package/dist/runtime/spreadsheet/components/spreadsheet-import-root.d.vue.ts +24 -0
- package/dist/runtime/spreadsheet/components/spreadsheet-import-root.vue +23 -0
- package/dist/runtime/spreadsheet/components/spreadsheet-import-root.vue.d.ts +24 -0
- package/dist/runtime/spreadsheet/components/spreadsheet-import.d.vue.ts +21 -6
- package/dist/runtime/spreadsheet/components/spreadsheet-import.vue +46 -262
- package/dist/runtime/spreadsheet/components/spreadsheet-import.vue.d.ts +21 -6
- package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-header.d.vue.ts → steps/spreadsheet-import-step-nav.d.vue.ts} +6 -2
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step-nav.vue +116 -0
- package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-header.vue.d.ts → steps/spreadsheet-import-step-nav.vue.d.ts} +6 -2
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step.d.vue.ts +26 -0
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step.vue +106 -0
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step.vue.d.ts +26 -0
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-stepper.d.vue.ts +15 -0
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-stepper.vue +131 -0
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-stepper.vue.d.ts +15 -0
- package/dist/runtime/spreadsheet/composables/index.d.ts +2 -0
- package/dist/runtime/spreadsheet/composables/index.js +2 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-answers.d.ts +8 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-answers.js +19 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-columns.d.ts +23 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-columns.js +75 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-context.d.ts +8 -45
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-context.js +28 -32
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-edits.d.ts +11 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-edits.js +25 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-fields.d.ts +16 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-fields.js +20 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-file.d.ts +14 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-file.js +44 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-import-context.d.ts +12 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-import-context.js +22 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-import.d.ts +18 -7
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-import.js +340 -109
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-layout.d.ts +36 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-layout.js +95 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-options.d.ts +24 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-options.js +159 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-queries.d.ts +14 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-queries.js +11 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-review.d.ts +37 -169
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-review.js +148 -408
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-rows.d.ts +48 -26
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-rows.js +334 -21
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-steps.d.ts +33 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-steps.js +126 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-submit.d.ts +37 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-submit.js +136 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-values.d.ts +27 -0
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-values.js +121 -0
- package/dist/runtime/spreadsheet/index.d.ts +0 -1
- package/dist/runtime/spreadsheet/index.js +0 -1
- package/dist/runtime/spreadsheet/schema/builder.d.ts +8 -0
- package/dist/runtime/spreadsheet/schema/builder.js +31 -0
- package/dist/runtime/spreadsheet/schema/index.d.ts +24 -32
- package/dist/runtime/spreadsheet/schema/index.js +4 -21
- package/dist/runtime/spreadsheet/types/columns.d.ts +252 -273
- package/dist/runtime/spreadsheet/types/fields.d.ts +64 -0
- package/dist/runtime/spreadsheet/types/importer.d.ts +308 -0
- package/dist/runtime/spreadsheet/types/index.d.ts +6 -10
- package/dist/runtime/spreadsheet/types/options.d.ts +47 -9
- package/dist/runtime/spreadsheet/types/rows.d.ts +57 -48
- package/dist/runtime/spreadsheet/types/schema.d.ts +162 -76
- package/dist/runtime/spreadsheet/types/shared.d.ts +19 -21
- package/dist/runtime/spreadsheet/types/source.d.ts +39 -15
- package/dist/runtime/spreadsheet/types/steps.d.ts +76 -0
- package/dist/runtime/spreadsheet/types/validation.d.ts +49 -69
- package/dist/runtime/spreadsheet/types/values.d.ts +77 -0
- package/dist/runtime/spreadsheet/utils/download.d.ts +2 -0
- package/dist/runtime/spreadsheet/utils/download.js +8 -0
- package/dist/runtime/spreadsheet/utils/export.d.ts +26 -0
- package/dist/runtime/spreadsheet/utils/export.js +50 -0
- package/dist/runtime/spreadsheet/utils/fields.d.ts +26 -0
- package/dist/runtime/spreadsheet/utils/fields.js +169 -0
- package/dist/runtime/spreadsheet/utils/guards.d.ts +18 -0
- package/dist/runtime/spreadsheet/utils/guards.js +27 -0
- package/dist/runtime/spreadsheet/utils/headers.d.ts +15 -0
- package/dist/runtime/spreadsheet/utils/headers.js +36 -0
- package/dist/runtime/spreadsheet/utils/identity.d.ts +24 -0
- package/dist/runtime/spreadsheet/utils/identity.js +57 -0
- package/dist/runtime/spreadsheet/utils/index.d.ts +15 -6
- package/dist/runtime/spreadsheet/utils/index.js +15 -6
- package/dist/runtime/spreadsheet/utils/layout.d.ts +12 -0
- package/dist/runtime/spreadsheet/utils/layout.js +37 -0
- package/dist/runtime/spreadsheet/utils/options.d.ts +31 -10
- package/dist/runtime/spreadsheet/utils/options.js +58 -30
- package/dist/runtime/spreadsheet/utils/parse.d.ts +6 -0
- package/dist/runtime/spreadsheet/utils/parse.js +147 -0
- package/dist/runtime/spreadsheet/utils/paths.d.ts +4 -0
- package/dist/runtime/spreadsheet/utils/paths.js +29 -0
- package/dist/runtime/spreadsheet/utils/rows.d.ts +69 -0
- package/dist/runtime/spreadsheet/utils/rows.js +168 -0
- package/dist/runtime/spreadsheet/utils/rules.d.ts +4 -0
- package/dist/runtime/spreadsheet/utils/rules.js +95 -0
- package/dist/runtime/spreadsheet/utils/suggestions.d.ts +20 -0
- package/dist/runtime/spreadsheet/utils/suggestions.js +43 -0
- package/dist/runtime/spreadsheet/utils/text.d.ts +9 -0
- package/dist/runtime/spreadsheet/utils/text.js +11 -0
- package/dist/runtime/spreadsheet/utils/workbook.d.ts +13 -0
- package/dist/runtime/spreadsheet/utils/workbook.js +121 -0
- package/dist/runtime/table/components/filters/tags/boolean-filter-tag.d.vue.ts +2 -2
- package/dist/runtime/table/components/filters/tags/boolean-filter-tag.vue.d.ts +2 -2
- package/dist/runtime/table/components/filters/tags/date-filter-tag.d.vue.ts +2 -2
- package/dist/runtime/table/components/filters/tags/date-filter-tag.vue.d.ts +2 -2
- package/dist/runtime/table/components/filters/tags/number-filter-tag.d.vue.ts +2 -2
- package/dist/runtime/table/components/filters/tags/number-filter-tag.vue.d.ts +2 -2
- package/dist/runtime/table/components/filters/tags/option-filter-tag.d.vue.ts +2 -2
- package/dist/runtime/table/components/filters/tags/option-filter-tag.vue.d.ts +2 -2
- package/dist/runtime/table/components/filters/tags/text-filter-tag.d.vue.ts +2 -2
- package/dist/runtime/table/components/filters/tags/text-filter-tag.vue.d.ts +2 -2
- package/dist/runtime/table/components/table/table-cell-ellipsis.d.ts +1 -1
- package/dist/runtime/table/composables/use-table-actions.d.ts +1 -1
- package/dist/runtime/table/composables/use-table-actions.js +11 -3
- package/dist/runtime/table/composables/use-table-internals.d.ts +3 -3
- package/dist/runtime/table/types/actions.d.ts +8 -1
- package/dist/runtime/table/utils/data-list-ui.d.ts +1 -1
- package/package.json +18 -3
- package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-file-bar.vue +0 -31
- package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-footer.d.vue.ts +0 -24
- package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-footer.vue +0 -69
- package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-footer.vue.d.ts +0 -24
- package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-header.vue +0 -36
- package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-sidebar.vue +0 -63
- package/dist/runtime/spreadsheet/components/shared/spreadsheet-object-preview-table.vue +0 -67
- package/dist/runtime/spreadsheet/components/shared/spreadsheet-raw-preview-table.vue +0 -41
- package/dist/runtime/spreadsheet/components/shared/spreadsheet-raw-preview-table.vue.d.ts +0 -7
- package/dist/runtime/spreadsheet/components/shared/spreadsheet-summary-stats.d.vue.ts +0 -10
- package/dist/runtime/spreadsheet/components/shared/spreadsheet-summary-stats.vue +0 -25
- package/dist/runtime/spreadsheet/components/shared/spreadsheet-summary-stats.vue.d.ts +0 -10
- package/dist/runtime/spreadsheet/components/shared/spreadsheet-value-preview.vue +0 -201
- package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-summary.d.vue.ts +0 -11
- package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-summary.vue +0 -38
- package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-summary.vue.d.ts +0 -11
- package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-table.d.vue.ts +0 -45
- package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-table.vue +0 -219
- package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-table.vue.d.ts +0 -45
- package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-accordion.d.vue.ts +0 -51
- package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-accordion.vue +0 -166
- package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-accordion.vue.d.ts +0 -51
- package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-summary.d.vue.ts +0 -11
- package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-summary.vue +0 -26
- package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-summary.vue.d.ts +0 -11
- package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-inspection.d.vue.ts +0 -41
- package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-inspection.vue +0 -392
- package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-inspection.vue.d.ts +0 -41
- package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-overflow-alert.vue +0 -43
- package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-stats.d.vue.ts +0 -15
- package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-stats.vue +0 -40
- package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-stats.vue.d.ts +0 -15
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-matching-step.d.vue.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-matching-step.vue +0 -137
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-matching-step.vue.d.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-references-step.d.vue.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-references-step.vue +0 -222
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-references-step.vue.d.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-review-step.d.vue.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-review-step.vue +0 -191
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-review-step.vue.d.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-structure-step.d.vue.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-structure-step.vue +0 -62
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-structure-step.vue.d.ts +0 -7
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-upload-step.d.vue.ts +0 -8
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-upload-step.vue +0 -81
- package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-upload-step.vue.d.ts +0 -8
- package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-preview-table.d.vue.ts +0 -15
- package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-preview-table.vue +0 -95
- package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-preview-table.vue.d.ts +0 -15
- package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-sheet-list.d.vue.ts +0 -15
- package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-sheet-list.vue +0 -56
- package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-sheet-list.vue.d.ts +0 -15
- package/dist/runtime/spreadsheet/components/types.d.ts +0 -41
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-column-matching.d.ts +0 -18
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-column-matching.js +0 -62
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-internals.d.ts +0 -629
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-internals.js +0 -68
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-references.d.ts +0 -1
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-references.js +0 -3
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-resolutions.d.ts +0 -40
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-resolutions.js +0 -97
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-row-state.d.ts +0 -24
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-row-state.js +0 -74
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-source.d.ts +0 -27
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-source.js +0 -109
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-view.d.ts +0 -15
- package/dist/runtime/spreadsheet/composables/use-spreadsheet-view.js +0 -109
- package/dist/runtime/spreadsheet/schema/normalize.d.ts +0 -73
- package/dist/runtime/spreadsheet/schema/normalize.js +0 -136
- package/dist/runtime/spreadsheet/types/context.d.ts +0 -9
- package/dist/runtime/spreadsheet/types/import.d.ts +0 -55
- package/dist/runtime/spreadsheet/types/inference.d.ts +0 -83
- package/dist/runtime/spreadsheet/types/normalized.d.ts +0 -50
- package/dist/runtime/spreadsheet/types/normalized.js +0 -0
- package/dist/runtime/spreadsheet/types/pipeline.d.ts +0 -7
- package/dist/runtime/spreadsheet/types/pipeline.js +0 -0
- package/dist/runtime/spreadsheet/types/reference-session.d.ts +0 -43
- package/dist/runtime/spreadsheet/types/reference-session.js +0 -0
- package/dist/runtime/spreadsheet/types/references.d.ts +0 -32
- package/dist/runtime/spreadsheet/types/references.js +0 -0
- package/dist/runtime/spreadsheet/types/resolution.d.ts +0 -43
- package/dist/runtime/spreadsheet/types/resolution.js +0 -0
- package/dist/runtime/spreadsheet/utils/builders/core.d.ts +0 -17
- package/dist/runtime/spreadsheet/utils/builders/core.js +0 -262
- package/dist/runtime/spreadsheet/utils/builders/index.d.ts +0 -1
- package/dist/runtime/spreadsheet/utils/builders/index.js +0 -1
- package/dist/runtime/spreadsheet/utils/context.d.ts +0 -20
- package/dist/runtime/spreadsheet/utils/context.js +0 -25
- package/dist/runtime/spreadsheet/utils/display.d.ts +0 -6
- package/dist/runtime/spreadsheet/utils/display.js +0 -26
- package/dist/runtime/spreadsheet/utils/object.d.ts +0 -9
- package/dist/runtime/spreadsheet/utils/object.js +0 -78
- package/dist/runtime/spreadsheet/utils/references/candidates.d.ts +0 -6
- package/dist/runtime/spreadsheet/utils/references/candidates.js +0 -28
- package/dist/runtime/spreadsheet/utils/references/core.d.ts +0 -3
- package/dist/runtime/spreadsheet/utils/references/core.js +0 -3
- package/dist/runtime/spreadsheet/utils/references/guards.d.ts +0 -4
- package/dist/runtime/spreadsheet/utils/references/guards.js +0 -28
- package/dist/runtime/spreadsheet/utils/references/index.d.ts +0 -1
- package/dist/runtime/spreadsheet/utils/references/index.js +0 -1
- package/dist/runtime/spreadsheet/utils/references/resolutions.d.ts +0 -17
- package/dist/runtime/spreadsheet/utils/references/resolutions.js +0 -172
- package/dist/runtime/spreadsheet/utils/references/shared.d.ts +0 -3
- package/dist/runtime/spreadsheet/utils/references/shared.js +0 -26
- package/dist/runtime/spreadsheet/utils/references/sources.d.ts +0 -9
- package/dist/runtime/spreadsheet/utils/references/sources.js +0 -38
- package/dist/runtime/spreadsheet/utils/rows/core.d.ts +0 -4
- package/dist/runtime/spreadsheet/utils/rows/core.js +0 -4
- package/dist/runtime/spreadsheet/utils/rows/headers.d.ts +0 -2
- package/dist/runtime/spreadsheet/utils/rows/headers.js +0 -9
- package/dist/runtime/spreadsheet/utils/rows/index.d.ts +0 -1
- package/dist/runtime/spreadsheet/utils/rows/index.js +0 -1
- package/dist/runtime/spreadsheet/utils/rows/matching.d.ts +0 -5
- package/dist/runtime/spreadsheet/utils/rows/matching.js +0 -209
- package/dist/runtime/spreadsheet/utils/rows/parsing.d.ts +0 -7
- package/dist/runtime/spreadsheet/utils/rows/parsing.js +0 -209
- package/dist/runtime/spreadsheet/utils/rows/shared.d.ts +0 -17
- package/dist/runtime/spreadsheet/utils/rows/shared.js +0 -309
- package/dist/runtime/spreadsheet/utils/rows/summary.d.ts +0 -2
- package/dist/runtime/spreadsheet/utils/rows/summary.js +0 -10
- package/dist/runtime/spreadsheet/utils/source/core.d.ts +0 -9
- package/dist/runtime/spreadsheet/utils/source/core.js +0 -65
- package/dist/runtime/spreadsheet/utils/source/index.d.ts +0 -1
- package/dist/runtime/spreadsheet/utils/source/index.js +0 -1
- package/dist/runtime/spreadsheet/utils/validation/core.d.ts +0 -16
- package/dist/runtime/spreadsheet/utils/validation/core.js +0 -211
- package/dist/runtime/spreadsheet/utils/validation/index.d.ts +0 -1
- package/dist/runtime/spreadsheet/utils/validation/index.js +0 -1
- /package/dist/runtime/spreadsheet/{components/types.js → types/fields.js} +0 -0
- /package/dist/runtime/spreadsheet/types/{context.js → importer.js} +0 -0
- /package/dist/runtime/spreadsheet/types/{import.js → steps.js} +0 -0
- /package/dist/runtime/spreadsheet/types/{inference.js → values.js} +0 -0
|
@@ -1,10 +1,31 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export declare function
|
|
1
|
+
import type { QueryFnDefinition } from '#ui-tools/shared/types/query';
|
|
2
|
+
import type { RemoteOptionsLoader } from '#ui-tools/shared/types/remote-options';
|
|
3
|
+
import type { SpreadsheetFieldOptions, SpreadsheetOptionItem, SpreadsheetOptionsSource, SpreadsheetResolvedOption } from '../types/index.js';
|
|
4
|
+
export declare function isSpreadsheetQueryDefinition<TData>(value: unknown): value is QueryFnDefinition<TData>;
|
|
5
|
+
export declare function isSpreadsheetRemoteLoader(value: unknown): value is RemoteOptionsLoader<SpreadsheetOptionItem>;
|
|
6
|
+
/**
|
|
7
|
+
* What a source gives once resolved against the context: a list, a query, or a remote loader.
|
|
8
|
+
* Sources reading the row are resolved per row instead (see `SpreadsheetField['select']`).
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveSpreadsheetOptionsSource(source: SpreadsheetOptionsSource<unknown, SpreadsheetOptionItem>, ctx: unknown): {
|
|
11
|
+
kind: 'list';
|
|
12
|
+
items: readonly SpreadsheetOptionItem[];
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'query';
|
|
15
|
+
query: QueryFnDefinition<readonly SpreadsheetOptionItem[]>;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'remote';
|
|
18
|
+
loader: RemoteOptionsLoader<SpreadsheetOptionItem>;
|
|
19
|
+
};
|
|
20
|
+
export declare function toSpreadsheetOption(item: SpreadsheetOptionItem): SpreadsheetResolvedOption;
|
|
21
|
+
/** Options indexed by every exact key they match: label, value, and aliases, normalized. */
|
|
22
|
+
export declare function indexSpreadsheetOptions(options: readonly SpreadsheetResolvedOption[]): Map<string, SpreadsheetResolvedOption>;
|
|
23
|
+
/** Options of a list, ready to match. */
|
|
24
|
+
export declare function createSpreadsheetFieldOptions(items: readonly SpreadsheetOptionItem[]): SpreadsheetFieldOptions;
|
|
25
|
+
/** Short stable id of a text (FNV-1a), for scope ids. */
|
|
26
|
+
export declare function hashSpreadsheetText(text: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Key of an answer: the normalized value, prefixed by the scope when the options depend on the
|
|
29
|
+
* row, since the same value may map to different options in each scope.
|
|
30
|
+
*/
|
|
31
|
+
export declare function spreadsheetAnswerKey(key: string, scope: string | null | undefined): string;
|
|
@@ -1,38 +1,66 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { isFunction } from "#ui-tools/shared/utils/predicate";
|
|
2
|
+
import { resolveTextValue } from "#ui-tools/shared/utils/render";
|
|
3
|
+
import {
|
|
4
|
+
isSpreadsheetOptionEntry,
|
|
5
|
+
isSpreadsheetOptionList,
|
|
6
|
+
isSpreadsheetOptionsResolver
|
|
7
|
+
} from "./guards.js";
|
|
8
|
+
import { isSpreadsheetRecord } from "./paths.js";
|
|
9
|
+
import { normalizeSpreadsheetText } from "./text.js";
|
|
10
|
+
export function isSpreadsheetQueryDefinition(value) {
|
|
11
|
+
return isSpreadsheetRecord(value) && Array.isArray(value.queryKey) && isFunction(value.queryFn);
|
|
5
12
|
}
|
|
6
|
-
export function
|
|
7
|
-
return
|
|
13
|
+
export function isSpreadsheetRemoteLoader(value) {
|
|
14
|
+
return isSpreadsheetRecord(value) && isFunction(value.load) && isFunction(value.resolveSelected);
|
|
8
15
|
}
|
|
9
|
-
export function
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return
|
|
15
|
-
}
|
|
16
|
-
if (isSpreadsheetOptionResolver(source)) {
|
|
17
|
-
return source(params);
|
|
16
|
+
export function resolveSpreadsheetOptionsSource(source, ctx) {
|
|
17
|
+
if (isSpreadsheetOptionList(source)) return { items: source, kind: "list" };
|
|
18
|
+
if (isSpreadsheetRemoteLoader(source)) return { kind: "remote", loader: source };
|
|
19
|
+
if (isSpreadsheetOptionsResolver(source)) {
|
|
20
|
+
const resolved = source({ ctx, row: {} });
|
|
21
|
+
return isSpreadsheetOptionList(resolved) ? { items: resolved, kind: "list" } : { kind: "query", query: resolved };
|
|
18
22
|
}
|
|
19
|
-
|
|
23
|
+
if (isSpreadsheetQueryDefinition(source))
|
|
24
|
+
return { kind: "query", query: source };
|
|
25
|
+
return { items: [], kind: "list" };
|
|
20
26
|
}
|
|
21
|
-
export function
|
|
22
|
-
if (
|
|
23
|
-
return
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return
|
|
27
|
+
export function toSpreadsheetOption(item) {
|
|
28
|
+
if (isSpreadsheetOptionEntry(item))
|
|
29
|
+
return {
|
|
30
|
+
aliases: item.aliases ?? [],
|
|
31
|
+
label: resolveTextValue(item.label, String(item.value)),
|
|
32
|
+
value: item.value
|
|
33
|
+
};
|
|
34
|
+
return { aliases: [], label: String(item), value: item };
|
|
29
35
|
}
|
|
30
|
-
export function
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
export function indexSpreadsheetOptions(options) {
|
|
37
|
+
const index = /* @__PURE__ */ new Map();
|
|
38
|
+
for (const option of options) {
|
|
39
|
+
for (const key of [option.label, String(option.value), ...option.aliases]) {
|
|
40
|
+
const normalized = normalizeSpreadsheetText(key);
|
|
41
|
+
if (normalized && !index.has(normalized)) index.set(normalized, option);
|
|
42
|
+
}
|
|
33
43
|
}
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
return index;
|
|
45
|
+
}
|
|
46
|
+
export function createSpreadsheetFieldOptions(items) {
|
|
47
|
+
const options = items.map(toSpreadsheetOption);
|
|
48
|
+
return {
|
|
49
|
+
error: null,
|
|
50
|
+
index: indexSpreadsheetOptions(options),
|
|
51
|
+
options,
|
|
52
|
+
remote: false,
|
|
53
|
+
status: "ready"
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function hashSpreadsheetText(text) {
|
|
57
|
+
let hash = 2166136261;
|
|
58
|
+
for (let index = 0; index < text.length; index++) {
|
|
59
|
+
hash ^= text.charCodeAt(index);
|
|
60
|
+
hash = Math.imul(hash, 16777619);
|
|
36
61
|
}
|
|
37
|
-
return
|
|
62
|
+
return (hash >>> 0).toString(36);
|
|
63
|
+
}
|
|
64
|
+
export function spreadsheetAnswerKey(key, scope) {
|
|
65
|
+
return scope ? `${scope}:${key}` : key;
|
|
38
66
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Reads a date: an Excel date, an Excel serial number, or text in one of `formats`. Returns ISO or `null`. */
|
|
2
|
+
export declare function parseSpreadsheetDate(text: string, raw: unknown, formats: readonly string[]): string | null;
|
|
3
|
+
/** Reads a number, with `,` or `.` as decimal separator; spaces and the other separator are ignored. */
|
|
4
|
+
export declare function parseSpreadsheetNumber(text: string, raw: unknown, decimal: '.' | ','): number | null;
|
|
5
|
+
/** Reads a boolean from the texts accepted as true and false. Returns `null` for anything else. */
|
|
6
|
+
export declare function parseSpreadsheetBoolean(text: string, raw: unknown, trueTexts: readonly string[], falseTexts: readonly string[]): boolean | null;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { SSF } from "xlsx";
|
|
2
|
+
import { normalizeSpreadsheetText } from "./text.js";
|
|
3
|
+
const MONTHS = [
|
|
4
|
+
["january", "jan", "janvier", "janv"],
|
|
5
|
+
["february", "feb", "fevrier", "fevr", "fev"],
|
|
6
|
+
["march", "mar", "mars"],
|
|
7
|
+
["april", "apr", "avril", "avr"],
|
|
8
|
+
["may", "mai"],
|
|
9
|
+
["june", "jun", "juin"],
|
|
10
|
+
["july", "jul", "juillet", "juil"],
|
|
11
|
+
["august", "aug", "aout"],
|
|
12
|
+
["september", "sep", "sept", "septembre"],
|
|
13
|
+
["october", "oct", "octobre"],
|
|
14
|
+
["november", "nov", "novembre"],
|
|
15
|
+
["december", "dec", "decembre"]
|
|
16
|
+
];
|
|
17
|
+
const DEFAULT_DATE_FORMATS = [
|
|
18
|
+
"yyyy-MM-dd",
|
|
19
|
+
"yyyy-MM-dd HH:mm",
|
|
20
|
+
"yyyy-MM-dd HH:mm:ss",
|
|
21
|
+
"dd/MM/yyyy",
|
|
22
|
+
"dd/MM/yyyy HH:mm"
|
|
23
|
+
];
|
|
24
|
+
const TOKENS = /yyyy|yy|MMMM|MMM|MM|M|dd|d|HH|H|hh|h|mm|ss|a/gu;
|
|
25
|
+
const pad = (value, length = 2) => String(value).padStart(length, "0");
|
|
26
|
+
function toIso(parts) {
|
|
27
|
+
const date = `${pad(parts.year, 4)}-${pad(parts.month)}-${pad(parts.day)}`;
|
|
28
|
+
if (!parts.hasTime) return date;
|
|
29
|
+
const time = `${pad(parts.hours)}:${pad(parts.minutes)}`;
|
|
30
|
+
return parts.seconds ? `${date}T${time}:${pad(parts.seconds)}` : `${date}T${time}`;
|
|
31
|
+
}
|
|
32
|
+
function isValidDate(parts) {
|
|
33
|
+
const date = new Date(parts.year, parts.month - 1, parts.day);
|
|
34
|
+
return date.getFullYear() === parts.year && date.getMonth() === parts.month - 1 && date.getDate() === parts.day && parts.hours < 24 && parts.minutes < 60 && parts.seconds < 60;
|
|
35
|
+
}
|
|
36
|
+
function monthFromName(name) {
|
|
37
|
+
const normalized = normalizeSpreadsheetText(name).replace(/\.$/u, "");
|
|
38
|
+
const index = MONTHS.findIndex((names) => names.includes(normalized));
|
|
39
|
+
return index < 0 ? 0 : index + 1;
|
|
40
|
+
}
|
|
41
|
+
const formatCache = /* @__PURE__ */ new Map();
|
|
42
|
+
function compileFormat(format) {
|
|
43
|
+
const cached = formatCache.get(format);
|
|
44
|
+
if (cached) return cached;
|
|
45
|
+
const tokens = [];
|
|
46
|
+
let source = "";
|
|
47
|
+
let last = 0;
|
|
48
|
+
for (const match of format.matchAll(TOKENS)) {
|
|
49
|
+
source += format.slice(last, match.index).replaceAll(/[.*+?^${}()|[\]\\]/gu, "\\$&").replaceAll(/\s+/gu, "\\s+");
|
|
50
|
+
tokens.push(match[0]);
|
|
51
|
+
source += match[0] === "MMMM" || match[0] === "MMM" ? "([\\p{L}]+\\.?)" : match[0] === "a" ? "([AaPp]\\.?[Mm]\\.?)" : match[0] === "yyyy" ? "(\\d{4})" : "(\\d{1,2})";
|
|
52
|
+
last = (match.index ?? 0) + match[0].length;
|
|
53
|
+
}
|
|
54
|
+
source += format.slice(last).replaceAll(/[.*+?^${}()|[\]\\]/gu, "\\$&").replaceAll(/\s+/gu, "\\s+");
|
|
55
|
+
const compiled = { pattern: new RegExp(`^${source}$`, "u"), tokens };
|
|
56
|
+
formatCache.set(format, compiled);
|
|
57
|
+
return compiled;
|
|
58
|
+
}
|
|
59
|
+
function parseWithFormat(text, format) {
|
|
60
|
+
const { pattern, tokens } = compileFormat(format);
|
|
61
|
+
const match = pattern.exec(text.trim());
|
|
62
|
+
if (!match) return null;
|
|
63
|
+
const parts = {
|
|
64
|
+
day: 1,
|
|
65
|
+
hasTime: false,
|
|
66
|
+
hours: 0,
|
|
67
|
+
minutes: 0,
|
|
68
|
+
month: 1,
|
|
69
|
+
seconds: 0,
|
|
70
|
+
year: 1970
|
|
71
|
+
};
|
|
72
|
+
let pm = null;
|
|
73
|
+
for (const [index, token] of tokens.entries()) {
|
|
74
|
+
const value = match[index + 1] ?? "";
|
|
75
|
+
const number = Number(value);
|
|
76
|
+
if (token === "yyyy") parts.year = number;
|
|
77
|
+
else if (token === "yy") parts.year = 2e3 + number;
|
|
78
|
+
else if (token === "MMMM" || token === "MMM") parts.month = monthFromName(value);
|
|
79
|
+
else if (token === "MM" || token === "M") parts.month = number;
|
|
80
|
+
else if (token === "dd" || token === "d") parts.day = number;
|
|
81
|
+
else if (token === "HH" || token === "H" || token === "hh" || token === "h") {
|
|
82
|
+
parts.hours = number;
|
|
83
|
+
parts.hasTime = true;
|
|
84
|
+
} else if (token === "mm") {
|
|
85
|
+
parts.minutes = number;
|
|
86
|
+
parts.hasTime = true;
|
|
87
|
+
} else if (token === "ss") parts.seconds = number;
|
|
88
|
+
else if (token === "a") pm = value.toLowerCase().startsWith("p");
|
|
89
|
+
}
|
|
90
|
+
if (pm !== null) {
|
|
91
|
+
if (parts.hours > 12 || parts.hours === 0) return null;
|
|
92
|
+
parts.hours = parts.hours % 12 + (pm ? 12 : 0);
|
|
93
|
+
}
|
|
94
|
+
return parts.month && isValidDate(parts) ? parts : null;
|
|
95
|
+
}
|
|
96
|
+
function partsFromDate(date) {
|
|
97
|
+
const hours = date.getHours();
|
|
98
|
+
const minutes = date.getMinutes();
|
|
99
|
+
const seconds = date.getSeconds();
|
|
100
|
+
return {
|
|
101
|
+
day: date.getDate(),
|
|
102
|
+
hasTime: Boolean(hours || minutes || seconds),
|
|
103
|
+
hours,
|
|
104
|
+
minutes,
|
|
105
|
+
month: date.getMonth() + 1,
|
|
106
|
+
seconds,
|
|
107
|
+
year: date.getFullYear()
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function parseSpreadsheetDate(text, raw, formats) {
|
|
111
|
+
if (raw instanceof Date && !Number.isNaN(raw.getTime())) return toIso(partsFromDate(raw));
|
|
112
|
+
if (typeof raw === "number") {
|
|
113
|
+
const code = SSF.parse_date_code(raw);
|
|
114
|
+
if (code && code.y > 1900) {
|
|
115
|
+
const parts = {
|
|
116
|
+
day: code.d,
|
|
117
|
+
hasTime: Boolean(code.H || code.M || code.S),
|
|
118
|
+
hours: code.H,
|
|
119
|
+
minutes: code.M,
|
|
120
|
+
month: code.m,
|
|
121
|
+
seconds: Math.round(code.S),
|
|
122
|
+
year: code.y
|
|
123
|
+
};
|
|
124
|
+
return toIso(parts);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const format of formats.length ? formats : DEFAULT_DATE_FORMATS) {
|
|
128
|
+
const parts = parseWithFormat(text, format);
|
|
129
|
+
if (parts) return toIso(parts);
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
export function parseSpreadsheetNumber(text, raw, decimal) {
|
|
134
|
+
if (typeof raw === "number" && Number.isFinite(raw)) return raw;
|
|
135
|
+
const compact = text.replaceAll(/[\s ']/gu, "");
|
|
136
|
+
const normalized = decimal === "," ? compact.replaceAll(".", "").replace(",", ".") : compact.replaceAll(",", "");
|
|
137
|
+
if (!/^[+-]?(\d+\.?\d*|\.\d+)$/u.test(normalized)) return null;
|
|
138
|
+
const value = Number(normalized);
|
|
139
|
+
return Number.isFinite(value) ? value : null;
|
|
140
|
+
}
|
|
141
|
+
export function parseSpreadsheetBoolean(text, raw, trueTexts, falseTexts) {
|
|
142
|
+
if (typeof raw === "boolean") return raw;
|
|
143
|
+
const normalized = normalizeSpreadsheetText(text);
|
|
144
|
+
if (trueTexts.some((value) => normalizeSpreadsheetText(value) === normalized)) return true;
|
|
145
|
+
if (falseTexts.some((value) => normalizeSpreadsheetText(value) === normalized)) return false;
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SpreadsheetRecord, SpreadsheetValue } from '../types/index.js';
|
|
2
|
+
export declare function isSpreadsheetRecord<T>(value: T): value is T & SpreadsheetRecord;
|
|
3
|
+
export declare function getSpreadsheetPathValue(data: SpreadsheetRecord, path: string): SpreadsheetValue;
|
|
4
|
+
export declare function setSpreadsheetPathValue(target: SpreadsheetRecord, path: string, value: SpreadsheetValue): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { isPlainObject } from "#ui-tools/shared/utils/predicate";
|
|
2
|
+
export function isSpreadsheetRecord(value) {
|
|
3
|
+
return isPlainObject(value);
|
|
4
|
+
}
|
|
5
|
+
export function getSpreadsheetPathValue(data, path) {
|
|
6
|
+
let current = data;
|
|
7
|
+
for (const part of path.split(".")) {
|
|
8
|
+
if (!isSpreadsheetRecord(current)) return void 0;
|
|
9
|
+
current = current[part];
|
|
10
|
+
}
|
|
11
|
+
return current;
|
|
12
|
+
}
|
|
13
|
+
export function setSpreadsheetPathValue(target, path, value) {
|
|
14
|
+
const parts = path.split(".");
|
|
15
|
+
let current = target;
|
|
16
|
+
for (const [index, part] of parts.entries()) {
|
|
17
|
+
if (index === parts.length - 1) {
|
|
18
|
+
current[part] = value;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const next = current[part];
|
|
22
|
+
if (isSpreadsheetRecord(next)) current = next;
|
|
23
|
+
else {
|
|
24
|
+
const created = {};
|
|
25
|
+
current[part] = created;
|
|
26
|
+
current = created;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { UiToolsTranslator } from '#ui-tools/i18n';
|
|
2
|
+
import type { SpreadsheetField, SpreadsheetFieldOptions, SpreadsheetRecord, SpreadsheetResolvedOption, SpreadsheetRowIssue, SpreadsheetValueAnswers } from '../types/index.js';
|
|
3
|
+
/** Options a select field checks a row against, and their scope when they depend on the row. */
|
|
4
|
+
export interface SpreadsheetRowOptions {
|
|
5
|
+
options: SpreadsheetFieldOptions | undefined;
|
|
6
|
+
/** Id of the set of options, when they depend on the row; `null` otherwise. */
|
|
7
|
+
scope: string | null;
|
|
8
|
+
}
|
|
9
|
+
/** What parsing needs besides the row: fields, their columns, options, answers, and the context. */
|
|
10
|
+
export interface SpreadsheetParseContext {
|
|
11
|
+
/** In declared order: a field reads the fields above it. */
|
|
12
|
+
fields: readonly SpreadsheetField[];
|
|
13
|
+
/** Column index of each field reading its own column. */
|
|
14
|
+
columns: ReadonlyMap<string, number>;
|
|
15
|
+
headers: readonly string[];
|
|
16
|
+
/** Options of a select field for a row, the fields above it parsed. */
|
|
17
|
+
optionsOf: (field: SpreadsheetField, row: SpreadsheetRecord) => SpreadsheetRowOptions;
|
|
18
|
+
answers: SpreadsheetValueAnswers;
|
|
19
|
+
ctx: unknown;
|
|
20
|
+
t: UiToolsTranslator;
|
|
21
|
+
}
|
|
22
|
+
/** A select item that matched no option, recorded to build the questions. */
|
|
23
|
+
export interface SpreadsheetUnmatchedToken {
|
|
24
|
+
field: string;
|
|
25
|
+
/** Normalized value. */
|
|
26
|
+
key: string;
|
|
27
|
+
value: string;
|
|
28
|
+
header: string;
|
|
29
|
+
scope: string | null;
|
|
30
|
+
}
|
|
31
|
+
export interface SpreadsheetMatchedToken {
|
|
32
|
+
field: string;
|
|
33
|
+
key: string;
|
|
34
|
+
value: string;
|
|
35
|
+
option: SpreadsheetResolvedOption;
|
|
36
|
+
scope: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface SpreadsheetCellResult {
|
|
39
|
+
text: string;
|
|
40
|
+
original: string;
|
|
41
|
+
display: string;
|
|
42
|
+
defaulted: boolean;
|
|
43
|
+
created: boolean;
|
|
44
|
+
/** Options of a select cell, for this row. */
|
|
45
|
+
choices: readonly SpreadsheetResolvedOption[];
|
|
46
|
+
}
|
|
47
|
+
export interface SpreadsheetParsedRow {
|
|
48
|
+
data: SpreadsheetRecord;
|
|
49
|
+
issues: SpreadsheetRowIssue[];
|
|
50
|
+
cells: Map<string, SpreadsheetCellResult>;
|
|
51
|
+
unmatched: SpreadsheetUnmatchedToken[];
|
|
52
|
+
matched: SpreadsheetMatchedToken[];
|
|
53
|
+
/** A value answered “skip these rows”, by the user or the policy. */
|
|
54
|
+
skipped: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parses one data row, field by field in declared order: each field reads its cell (or the cell
|
|
58
|
+
* of its `from` column), applies its default, parser, options, and value answers, then its rules.
|
|
59
|
+
* Defaults, parsers, options, and rules receive the fields above as `row`. Nothing is guessed: a
|
|
60
|
+
* select value matches an option exactly, or it is answered, or it follows the column's `unknown`
|
|
61
|
+
* policy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function parseSpreadsheetRow(params: {
|
|
64
|
+
index: number;
|
|
65
|
+
cells: readonly string[];
|
|
66
|
+
raws: readonly unknown[] | undefined;
|
|
67
|
+
edits: Readonly<Record<string, string>> | undefined;
|
|
68
|
+
context: SpreadsheetParseContext;
|
|
69
|
+
}): SpreadsheetParsedRow;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { spreadsheetAnswerKey } from "./options.js";
|
|
2
|
+
import { parseSpreadsheetBoolean, parseSpreadsheetDate, parseSpreadsheetNumber } from "./parse.js";
|
|
3
|
+
import { setSpreadsheetPathValue } from "./paths.js";
|
|
4
|
+
import { normalizeSpreadsheetText, splitSpreadsheetItems, toSpreadsheetText } from "./text.js";
|
|
5
|
+
function displayValue(field, value, options) {
|
|
6
|
+
const items = Array.isArray(value) ? value : [value];
|
|
7
|
+
return items.filter((item) => item !== null && item !== void 0).map((item) => {
|
|
8
|
+
if (field.kind !== "select") return toSpreadsheetText(item);
|
|
9
|
+
return options?.options.find((option) => option.value === item)?.label ?? toSpreadsheetText(item);
|
|
10
|
+
}).join(", ");
|
|
11
|
+
}
|
|
12
|
+
function parseScalar(params) {
|
|
13
|
+
const { field, text, raw } = params;
|
|
14
|
+
if (field.parse) {
|
|
15
|
+
try {
|
|
16
|
+
return {
|
|
17
|
+
value: field.parse({
|
|
18
|
+
cell: { header: params.header, raw: raw ?? text, rowIndex: params.rowIndex, text },
|
|
19
|
+
ctx: params.ctx,
|
|
20
|
+
row: params.row
|
|
21
|
+
})
|
|
22
|
+
};
|
|
23
|
+
} catch (error) {
|
|
24
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (field.kind === "number") {
|
|
28
|
+
const value = parseSpreadsheetNumber(text, raw, field.decimal);
|
|
29
|
+
return value === null ? { error: "number" } : { value };
|
|
30
|
+
}
|
|
31
|
+
if (field.kind === "date") {
|
|
32
|
+
const value = parseSpreadsheetDate(text, raw, field.formats);
|
|
33
|
+
return value === null ? { error: "date" } : { value };
|
|
34
|
+
}
|
|
35
|
+
if (field.kind === "boolean") {
|
|
36
|
+
const value = parseSpreadsheetBoolean(text, raw, field.trueTexts, field.falseTexts);
|
|
37
|
+
return value === null ? { error: "boolean" } : { value };
|
|
38
|
+
}
|
|
39
|
+
return { value: text };
|
|
40
|
+
}
|
|
41
|
+
function errorMessage(error) {
|
|
42
|
+
return error instanceof Error ? error.message : String(error);
|
|
43
|
+
}
|
|
44
|
+
export function parseSpreadsheetRow(params) {
|
|
45
|
+
const { context, edits } = params;
|
|
46
|
+
const { t } = context;
|
|
47
|
+
const data = {};
|
|
48
|
+
const issues = [];
|
|
49
|
+
const cells = /* @__PURE__ */ new Map();
|
|
50
|
+
const unmatched = [];
|
|
51
|
+
const matched = [];
|
|
52
|
+
let skipped = false;
|
|
53
|
+
for (const field of context.fields) {
|
|
54
|
+
const from = field.select?.from ?? null;
|
|
55
|
+
const column = from ? context.columns.get(from) : context.columns.get(field.path);
|
|
56
|
+
const header = column === void 0 ? "" : context.headers[column] ?? "";
|
|
57
|
+
const original = from ? cells.get(from)?.text ?? "" : column === void 0 ? "" : toSpreadsheetText(params.cells[column]);
|
|
58
|
+
const edited = edits?.[field.path];
|
|
59
|
+
const text = edited ?? original;
|
|
60
|
+
const raw = edited === void 0 && !from && column !== void 0 ? params.raws?.[column] : void 0;
|
|
61
|
+
const issue = (code, message, level = "error") => issues.push({ code, field: field.path, level, message });
|
|
62
|
+
let resolved = { options: void 0, scope: null };
|
|
63
|
+
if (field.select) {
|
|
64
|
+
try {
|
|
65
|
+
resolved = context.optionsOf(field, data);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
issue("options", errorMessage(error));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const { options, scope } = resolved;
|
|
71
|
+
const choices = options?.options ?? [];
|
|
72
|
+
if (!text) {
|
|
73
|
+
let value2 = field.separator ? [] : null;
|
|
74
|
+
if (field.defaultOf) {
|
|
75
|
+
try {
|
|
76
|
+
value2 = field.defaultOf(data) ?? value2;
|
|
77
|
+
} catch (error) {
|
|
78
|
+
issue("default", errorMessage(error));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
setSpreadsheetPathValue(data, field.path, value2);
|
|
82
|
+
cells.set(field.path, {
|
|
83
|
+
choices,
|
|
84
|
+
created: false,
|
|
85
|
+
defaulted: field.hasDefault,
|
|
86
|
+
display: field.hasDefault ? displayValue(field, value2, options) : "",
|
|
87
|
+
original,
|
|
88
|
+
text
|
|
89
|
+
});
|
|
90
|
+
if (field.required && !field.hasDefault) issue("required", t("spreadsheet.issues.required"));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const items = field.separator ? splitSpreadsheetItems(text, field.separator) : [text];
|
|
94
|
+
const values = [];
|
|
95
|
+
let created = false;
|
|
96
|
+
if (field.kind === "select" && field.select) {
|
|
97
|
+
for (const item of items) {
|
|
98
|
+
const key = normalizeSpreadsheetText(item);
|
|
99
|
+
const option = options?.index.get(key);
|
|
100
|
+
if (option) {
|
|
101
|
+
values.push(option.value);
|
|
102
|
+
matched.push({ field: field.path, key, option, scope, value: item });
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (!options || options.status !== "ready") continue;
|
|
106
|
+
unmatched.push({ field: field.path, header, key, scope, value: item });
|
|
107
|
+
const answer = context.answers[field.path]?.[spreadsheetAnswerKey(key, scope)] ?? (field.select.unknown === "ask" || field.select.unknown === "error" ? void 0 : { action: field.select.unknown });
|
|
108
|
+
if (answer?.action === "map") values.push(answer.value);
|
|
109
|
+
else if (answer?.action === "create") {
|
|
110
|
+
values.push(item);
|
|
111
|
+
created = true;
|
|
112
|
+
} else if (answer?.action === "skip-rows") {
|
|
113
|
+
skipped = true;
|
|
114
|
+
issue("value.skipped", t("spreadsheet.issues.skipped", { value: item }), "info");
|
|
115
|
+
} else if (answer?.action === "leave-empty") continue;
|
|
116
|
+
else if (field.select.unknown === "error")
|
|
117
|
+
issue("value.not-found", t("spreadsheet.issues.notFound", { value: item }));
|
|
118
|
+
else issue("value.unknown", t("spreadsheet.issues.unknownValue", { value: item }));
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
for (const item of items) {
|
|
122
|
+
const result = parseScalar({
|
|
123
|
+
ctx: context.ctx,
|
|
124
|
+
field,
|
|
125
|
+
header,
|
|
126
|
+
raw: items.length > 1 ? void 0 : raw,
|
|
127
|
+
row: data,
|
|
128
|
+
rowIndex: params.index,
|
|
129
|
+
text: item
|
|
130
|
+
});
|
|
131
|
+
if ("value" in result) values.push(result.value);
|
|
132
|
+
else if (result.error === "number" || result.error === "date" || result.error === "boolean")
|
|
133
|
+
issue(result.error, t(`spreadsheet.issues.${result.error}`, { value: item }));
|
|
134
|
+
else issue("parse", result.error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const value = field.separator ? values : values[0] ?? null;
|
|
138
|
+
setSpreadsheetPathValue(data, field.path, value);
|
|
139
|
+
cells.set(field.path, {
|
|
140
|
+
choices,
|
|
141
|
+
created,
|
|
142
|
+
defaulted: false,
|
|
143
|
+
display: displayValue(field, value, options) || text,
|
|
144
|
+
original,
|
|
145
|
+
text
|
|
146
|
+
});
|
|
147
|
+
if (field.required && (value === null || Array.isArray(value) && !value.length) && !issues.some((entry) => entry.field === field.path))
|
|
148
|
+
issue("required", t("spreadsheet.issues.required"));
|
|
149
|
+
let rules = [];
|
|
150
|
+
try {
|
|
151
|
+
rules = field.rulesOf(data);
|
|
152
|
+
} catch (error) {
|
|
153
|
+
issue("rules", errorMessage(error));
|
|
154
|
+
}
|
|
155
|
+
for (const rule of rules) {
|
|
156
|
+
const targets = field.separator ? values : [value];
|
|
157
|
+
for (const target of targets) {
|
|
158
|
+
if (target === null && !rule.required) continue;
|
|
159
|
+
const message = rule.check(target, { ctx: context.ctx });
|
|
160
|
+
if (message) {
|
|
161
|
+
issue(rule.name, message, rule.level);
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { cells, data, issues, matched, skipped, unmatched };
|
|
168
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { UiToolsTranslator } from '#ui-tools/i18n';
|
|
2
|
+
import type { SpreadsheetRuleBuilder } from '../types/index.js';
|
|
3
|
+
/** The `v` of `rules: (v) => [...]`, with messages from the locale. */
|
|
4
|
+
export declare function createSpreadsheetRuleBuilder(t: UiToolsTranslator): SpreadsheetRuleBuilder<unknown>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { isSpreadsheetMessageFunction } from "./guards.js";
|
|
2
|
+
const EMAIL = /^[^@\s]+@[^@\s]+\.[^@\s]{2,}$/u;
|
|
3
|
+
function resolveMessage(message, value, ctx) {
|
|
4
|
+
if (isSpreadsheetMessageFunction(message)) return String(message({ ctx, value }));
|
|
5
|
+
return typeof message === "string" || typeof message === "number" ? String(message) : String(message());
|
|
6
|
+
}
|
|
7
|
+
function createRule(params) {
|
|
8
|
+
return {
|
|
9
|
+
check(value, context) {
|
|
10
|
+
return params.test(value, context.ctx) ? null : resolveMessage(params.message, value, context.ctx);
|
|
11
|
+
},
|
|
12
|
+
level: params.level ?? "error",
|
|
13
|
+
name: params.name,
|
|
14
|
+
required: params.required ?? false
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function withOptions(options, fallback) {
|
|
18
|
+
return { level: options?.level, message: options?.message ?? fallback };
|
|
19
|
+
}
|
|
20
|
+
function isEmpty(value) {
|
|
21
|
+
return value === null || value === void 0 || value === "" || Array.isArray(value) && value.length === 0;
|
|
22
|
+
}
|
|
23
|
+
const pad = (part) => String(part).padStart(2, "0");
|
|
24
|
+
function todayIso() {
|
|
25
|
+
const now = /* @__PURE__ */ new Date();
|
|
26
|
+
return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;
|
|
27
|
+
}
|
|
28
|
+
export function createSpreadsheetRuleBuilder(t) {
|
|
29
|
+
return {
|
|
30
|
+
between: (min, max, options) => createRule({
|
|
31
|
+
name: "between",
|
|
32
|
+
...withOptions(
|
|
33
|
+
options,
|
|
34
|
+
({ value }) => t("spreadsheet.issues.between", { max, min, value: String(value) })
|
|
35
|
+
),
|
|
36
|
+
test: (value) => value >= min && value <= max
|
|
37
|
+
}),
|
|
38
|
+
email: (options) => createRule({
|
|
39
|
+
name: "email",
|
|
40
|
+
...withOptions(options, () => t("spreadsheet.issues.email")),
|
|
41
|
+
test: (value) => EMAIL.test(value)
|
|
42
|
+
}),
|
|
43
|
+
max: (max, options) => createRule({
|
|
44
|
+
name: "max",
|
|
45
|
+
...withOptions(
|
|
46
|
+
options,
|
|
47
|
+
({ value }) => t("spreadsheet.issues.max", { max, value: String(value) })
|
|
48
|
+
),
|
|
49
|
+
test: (value) => value <= max
|
|
50
|
+
}),
|
|
51
|
+
maxLength: (max, options) => createRule({
|
|
52
|
+
name: "maxLength",
|
|
53
|
+
...withOptions(options, () => t("spreadsheet.issues.maxLength", { max })),
|
|
54
|
+
test: (value) => value.length <= max
|
|
55
|
+
}),
|
|
56
|
+
min: (min, options) => createRule({
|
|
57
|
+
name: "min",
|
|
58
|
+
...withOptions(
|
|
59
|
+
options,
|
|
60
|
+
({ value }) => t("spreadsheet.issues.min", { min, value: String(value) })
|
|
61
|
+
),
|
|
62
|
+
test: (value) => value >= min
|
|
63
|
+
}),
|
|
64
|
+
minLength: (min, options) => createRule({
|
|
65
|
+
name: "minLength",
|
|
66
|
+
...withOptions(options, () => t("spreadsheet.issues.minLength", { min })),
|
|
67
|
+
test: (value) => value.length >= min
|
|
68
|
+
}),
|
|
69
|
+
notFuture: (options) => createRule({
|
|
70
|
+
name: "notFuture",
|
|
71
|
+
...withOptions(options, () => t("spreadsheet.issues.notFuture")),
|
|
72
|
+
test: (value) => value.slice(0, 10) <= todayIso()
|
|
73
|
+
}),
|
|
74
|
+
pattern: (pattern, options) => createRule({
|
|
75
|
+
name: "pattern",
|
|
76
|
+
...withOptions(options, () => t("spreadsheet.issues.pattern")),
|
|
77
|
+
test: (value) => {
|
|
78
|
+
pattern.lastIndex = 0;
|
|
79
|
+
return pattern.test(value);
|
|
80
|
+
}
|
|
81
|
+
}),
|
|
82
|
+
required: (options) => createRule({
|
|
83
|
+
name: "required",
|
|
84
|
+
required: true,
|
|
85
|
+
...withOptions(options, () => t("spreadsheet.issues.required")),
|
|
86
|
+
test: (value) => !isEmpty(value)
|
|
87
|
+
}),
|
|
88
|
+
validate: (options) => createRule({
|
|
89
|
+
level: options.level,
|
|
90
|
+
message: options.message,
|
|
91
|
+
name: options.name ?? "validate",
|
|
92
|
+
test: (value, ctx) => options.validator(value, { ctx })
|
|
93
|
+
})
|
|
94
|
+
};
|
|
95
|
+
}
|