@platforma-sdk/ui-vue 1.45.35 → 1.45.37
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/.turbo/turbo-build.log +204 -235
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +13 -0
- package/dist/AgGridVue/useAgGridOptions.js +2 -3
- package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
- package/dist/components/BlockLayout.vue2.js +3 -3
- package/dist/components/BlockLayout.vue2.js.map +1 -1
- package/dist/components/BlockLoader.vue.js.map +1 -1
- package/dist/components/LoaderPage.vue.js +2 -2
- package/dist/components/LoaderPage.vue.js.map +1 -1
- package/dist/components/NotFound.vue.js +3 -3
- package/dist/components/NotFound.vue.js.map +1 -1
- package/dist/components/PlAdvancedFilter/OperandButton.vue2.js.map +1 -1
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +73 -73
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -1
- package/dist/components/PlAdvancedFilter/SingleFilter.vue2.js +100 -100
- package/dist/components/PlAdvancedFilter/SingleFilter.vue2.js.map +1 -1
- package/dist/components/PlAgCellFile/PlAgCellFile.vue.js.map +1 -1
- package/dist/components/PlAgCellProgress/PlAgCellProgress.vue.js.map +1 -1
- package/dist/components/PlAgCellStatusTag/PlAgCellStatusTag.vue.js +6 -6
- package/dist/components/PlAgCellStatusTag/PlAgCellStatusTag.vue.js.map +1 -1
- package/dist/components/PlAgChartHistogramCell/PlAgChartHistogramCell.vue.js.map +1 -1
- package/dist/components/PlAgChartStackedBarCell/PlAgChartStackedBarCell.vue.js.map +1 -1
- package/dist/components/PlAgColumnHeader/PlAgColumnHeader.vue.js +22 -22
- package/dist/components/PlAgColumnHeader/PlAgColumnHeader.vue.js.map +1 -1
- package/dist/components/PlAgCsvExporter/PlAgCsvExporter.vue.js +3 -3
- package/dist/components/PlAgCsvExporter/PlAgCsvExporter.vue.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +50 -50
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgOverlayLoading.vue.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgOverlayNoRows.vue.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgRowCount.vue.js +7 -8
- package/dist/components/PlAgDataTable/PlAgRowCount.vue.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js +35 -35
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js.map +1 -1
- package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js +16 -17
- package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js.map +1 -1
- package/dist/components/PlAgRowNumHeader.vue.js +14 -15
- package/dist/components/PlAgRowNumHeader.vue.js.map +1 -1
- package/dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue.js +16 -16
- package/dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue.js.map +1 -1
- package/dist/components/PlAnnotations/components/AnnotationsSidebar.vue2.js +6 -6
- package/dist/components/PlAnnotations/components/AnnotationsSidebar.vue2.js.map +1 -1
- package/dist/components/PlAnnotations/components/DynamicForm.vue2.js +57 -57
- package/dist/components/PlAnnotations/components/DynamicForm.vue2.js.map +1 -1
- package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +6 -6
- package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
- package/dist/components/PlAnnotations/components/PlAnnotations.vue2.js.map +1 -1
- package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js.map +1 -1
- package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue.js +7 -7
- package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue.js.map +1 -1
- package/dist/components/PlBtnExportArchive/Item.vue2.js +23 -23
- package/dist/components/PlBtnExportArchive/Item.vue2.js.map +1 -1
- package/dist/components/PlBtnExportArchive/PlBtnExportArchive.vue2.js.map +1 -1
- package/dist/components/PlBtnExportArchive/Summary.vue2.js +22 -22
- package/dist/components/PlBtnExportArchive/Summary.vue2.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableAddFilterV2.vue.js +9 -9
- package/dist/components/PlTableFilters/PlTableAddFilterV2.vue.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFilterEntryV2.vue.js +3 -3
- package/dist/components/PlTableFilters/PlTableFilterEntryV2.vue.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +9 -9
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
- package/dist/components/ValueOrErrorsComponent.vue.js.map +1 -1
- package/dist/index.js +48 -50
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +0 -1
- package/dist/plugins/Monetization/EndOfPeriod.vue2.js +9 -9
- package/dist/plugins/Monetization/EndOfPeriod.vue2.js.map +1 -1
- package/dist/plugins/Monetization/LimitCard.vue2.js +40 -40
- package/dist/plugins/Monetization/LimitCard.vue2.js.map +1 -1
- package/dist/plugins/Monetization/MonetizationSidebar.vue.js +3 -3
- package/dist/plugins/Monetization/MonetizationSidebar.vue.js.map +1 -1
- package/dist/plugins/Monetization/RunStatus.vue2.js +12 -12
- package/dist/plugins/Monetization/RunStatus.vue2.js.map +1 -1
- package/dist/plugins/Monetization/UserCabinetCard.vue2.js +22 -22
- package/dist/plugins/Monetization/UserCabinetCard.vue2.js.map +1 -1
- package/package.json +7 -8
- package/src/lib.ts +0 -2
- package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js +0 -6
- package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js.map +0 -1
- package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js +0 -5
- package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue.d.ts +0 -9
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js +0 -122
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Legend.vue.d.ts +0 -6
- package/dist/components/PlMultiSequenceAlignment/Legend.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/Legend.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js +0 -28
- package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js +0 -13
- package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts +0 -25
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +0 -138
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +0 -31
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.d.ts +0 -8
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js +0 -77
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +0 -71
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +0 -224
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.d.ts +0 -8
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js +0 -127
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts +0 -16
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +0 -228
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js +0 -19
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/cell-size.d.ts +0 -4
- package/dist/components/PlMultiSequenceAlignment/cell-size.js +0 -8
- package/dist/components/PlMultiSequenceAlignment/cell-size.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts +0 -44
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.js +0 -132
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/data.d.ts +0 -61
- package/dist/components/PlMultiSequenceAlignment/data.js +0 -370
- package/dist/components/PlMultiSequenceAlignment/data.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/index.d.ts +0 -1
- package/dist/components/PlMultiSequenceAlignment/markup.d.ts +0 -16
- package/dist/components/PlMultiSequenceAlignment/markup.js +0 -84
- package/dist/components/PlMultiSequenceAlignment/markup.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/migrations.d.ts +0 -3
- package/dist/components/PlMultiSequenceAlignment/migrations.js +0 -24
- package/dist/components/PlMultiSequenceAlignment/migrations.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.d.ts +0 -6
- package/dist/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.d.ts +0 -7
- package/dist/components/PlMultiSequenceAlignment/residue-counts.d.ts +0 -2
- package/dist/components/PlMultiSequenceAlignment/residue-counts.js +0 -13
- package/dist/components/PlMultiSequenceAlignment/residue-counts.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/settings.d.ts +0 -2
- package/dist/components/PlMultiSequenceAlignment/settings.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/settings.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/types.d.ts +0 -5
- package/dist/components/PlMultiSequenceAlignment/useMiPlots.d.ts +0 -4
- package/dist/components/PlMultiSequenceAlignment/useMiPlots.js +0 -19
- package/dist/components/PlMultiSequenceAlignment/useMiPlots.js.map +0 -1
- package/src/components/PlMultiSequenceAlignment/Consensus.vue +0 -165
- package/src/components/PlMultiSequenceAlignment/Legend.vue +0 -44
- package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +0 -299
- package/src/components/PlMultiSequenceAlignment/PhylogeneticTree.vue +0 -110
- package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +0 -314
- package/src/components/PlMultiSequenceAlignment/README.md +0 -216
- package/src/components/PlMultiSequenceAlignment/SeqLogo.vue +0 -166
- package/src/components/PlMultiSequenceAlignment/Toolbar.vue +0 -228
- package/src/components/PlMultiSequenceAlignment/cell-size.ts +0 -4
- package/src/components/PlMultiSequenceAlignment/chemical-properties.ts +0 -199
- package/src/components/PlMultiSequenceAlignment/data.ts +0 -661
- package/src/components/PlMultiSequenceAlignment/index.ts +0 -1
- package/src/components/PlMultiSequenceAlignment/markup.ts +0 -141
- package/src/components/PlMultiSequenceAlignment/migrations.ts +0 -46
- package/src/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.ts +0 -54
- package/src/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.ts +0 -89
- package/src/components/PlMultiSequenceAlignment/residue-counts.ts +0 -124
- package/src/components/PlMultiSequenceAlignment/settings.ts +0 -7
- package/src/components/PlMultiSequenceAlignment/types.ts +0 -3
- package/src/components/PlMultiSequenceAlignment/useMiPlots.ts +0 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlBtnExportArchive.vue2.js","sources":["../../../src/components/PlBtnExportArchive/PlBtnExportArchive.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlIcon16,\n PlIcon24,\n useClickOutside,\n} from '@milaboratories/uikit';\nimport { ZipWriter } from '@zip.js/zip.js';\nimport { reactive, computed, ref } from 'vue';\nimport type { ExportItem, ExportsMap, FileExportEntry } from './types';\nimport Item from './Item.vue';\nimport { getFileNameFromHandle, ChunkedStreamReader } from '@platforma-sdk/model';\nimport { getRawPlatformaInstance } from '@platforma-sdk/model';\nimport { uniqueId } from '@milaboratories/helpers';\nimport Summary from './Summary.vue';\n\ntype FilePickerAcceptType = {\n description?: string;\n accept?: Record<string, string[]>;\n};\n\nconst props = defineProps<{\n fileExports?: FileExportEntry[];\n suggestedFileName?: string;\n disabled?: boolean;\n filePickerTypes?: FilePickerAcceptType[];\n strategy?: 'parallel'; // default is sequential\n debugFn?: (fileName: string) => Promise<void>;\n}>();\n\nconst defaultData = () => ({\n loading: false,\n name: '',\n exports: undefined as ExportsMap | undefined,\n showExports: false,\n});\n\nconst data = reactive(defaultData());\n\nconst updateExportsItem = (id: string, partial: Partial<ExportItem>) => {\n const it = data.exports?.get(id);\n if (it) {\n data.exports?.set(id, { ...it, ...partial });\n }\n};\n\nconst isReadyToExport = computed(() => {\n return props.fileExports !== undefined && !props.disabled;\n});\n\nconst items = computed(() => {\n return Array.from(data.exports?.values() ?? []);\n});\n\nconst archive = computed<ExportItem>(() => {\n return {\n fileName: data.name,\n current: items.value.reduce((acc, item) => acc + item.current, 0),\n size: items.value.reduce((acc, item) => acc + item.size, 0),\n status: items.value.some((item) => item.status === 'in-progress') ? 'in-progress' : items.value.every((item) => item.status === 'completed') ? 'completed' : 'pending',\n hasErrors: items.value.some((item) => item.status === 'error'),\n };\n});\n\ntype ZipRequest = {\n id: string;\n fileName: string;\n size: number;\n stream: ReadableStream<Uint8Array>;\n};\n\nconst exportRawTsvs = async () => {\n if (data.loading) {\n data.showExports = true;\n return;\n }\n\n if (!isReadyToExport.value || !props.fileExports) {\n return;\n }\n\n const defaultFileName = `${new Date().toISOString().split('T')[0]}_Export.zip`;\n const defaultTypes = [{\n description: 'ZIP files',\n accept: {\n 'application/zip': ['.zip'],\n },\n }];\n\n // @ts-expect-error - type definition issue TODO: fix this\n const newHandle = await window.showSaveFilePicker({\n types: props.filePickerTypes || defaultTypes,\n suggestedName: props.suggestedFileName || defaultFileName,\n });\n\n data.loading = true;\n data.name = newHandle.name;\n data.showExports = true;\n data.exports = new Map();\n\n try {\n const writableStream = await newHandle.createWritable();\n const zip = new ZipWriter(writableStream, { keepOrder: true, zip64: true, bufferedWrite: false });\n try {\n const requests = [] as ZipRequest[];\n\n for (const entry of props.fileExports) {\n const { importHandle, blobHandle, fileName: customFileName } = entry;\n const fileName = customFileName ?? getFileNameFromHandle(importHandle);\n const { handle, size } = blobHandle;\n\n const id = uniqueId();\n\n data.exports?.set(id, { fileName, current: 0, size, status: 'pending' });\n\n const stream = ChunkedStreamReader.create({\n fetchChunk: async ({ from, to }) => {\n if (props.debugFn) {\n await props.debugFn(fileName);\n }\n\n return await getRawPlatformaInstance().blobDriver.getContent(handle, { from, to });\n },\n totalSize: size,\n onError: async (error) => {\n updateExportsItem(id, { status: 'error', error });\n await new Promise((resolve) => setTimeout(resolve, 1000)); // primitive for now\n return 'continue';\n },\n });\n\n // Create a chunked stream reader for efficient streaming\n requests.push({ id, fileName, size, stream });\n }\n\n const processRequest = async (request: ZipRequest) => {\n const { id, fileName, size, stream } = request;\n const update = (partial: Partial<ExportItem>) => {\n const it = data.exports?.get(id);\n if (it) {\n data.exports?.set(id, { ...it, ...partial });\n }\n };\n await zip.add(fileName, stream, {\n bufferedWrite: true,\n onstart: () => {\n update({ status: 'in-progress' });\n return undefined;\n },\n onprogress: (current: number) => {\n update({ current, status: 'in-progress' });\n return undefined;\n },\n onend() {\n update({ current: size, status: 'completed' });\n return undefined;\n },\n });\n };\n\n if (props.strategy === 'parallel') {\n await Promise.all(requests.map(processRequest));\n } else {\n for (const request of requests) {\n await processRequest(request);\n }\n }\n } finally {\n await zip.close().catch((error) => {\n console.error('Error closing zip', error);\n });\n }\n } finally {\n data.loading = false;\n }\n};\n\nconst progressesRef = ref();\n\nuseClickOutside([progressesRef], () => {\n data.showExports = false;\n});\n</script>\n\n<template>\n <PlBtnGhost\n :disabled=\"!isReadyToExport\" :loading=\"data.loading\" :class=\"{ [$style['has-exports']]: data.exports }\"\n @click.stop=\"exportRawTsvs\"\n >\n <slot />\n <template #append>\n <PlIcon24 :class=\"$style.icon\" name=\"download\" />\n </template>\n </PlBtnGhost>\n <Teleport to=\"body\">\n <div v-if=\"data.exports && data.showExports\" ref=\"progressesRef\" :class=\"$style.progresses\">\n <PlIcon16 :class=\"$style.close\" name=\"close\" @click.stop=\"data.showExports = false\" />\n <Summary :item=\"archive\" />\n <div :class=\"$style.itemsContainer\" class=\"pl-scrollable-y\">\n <Item v-for=\"item in data.exports?.values()\" :key=\"item.fileName\" :item=\"item\" />\n </div>\n </div>\n </Teleport>\n</template>\n\n<style module>\n.progresses {\n position: fixed;\n top: 8px;\n right: 8px;\n width: 350px;\n height: auto;\n max-height: 400px;\n overflow: auto;\n background: rgba(0, 0, 0, 0.85);\n border-radius: 8px;\n padding: 20px 8px 8px 20px;\n color: white;\n font-size: 12px;\n font-weight: 600;\n z-index: 1000;\n\n .itemsContainer {\n max-height: 300px;\n }\n\n .close {\n position: absolute;\n top: 8px;\n right: 8px;\n cursor: pointer;\n --icon-color: white;\n }\n}\n</style>\n"],"names":["props","__props","data","reactive","updateExportsItem","id","partial","it","_a","_b","isReadyToExport","computed","items","archive","acc","item","exportRawTsvs","defaultFileName","defaultTypes","newHandle","writableStream","zip","ZipWriter","requests","entry","importHandle","blobHandle","customFileName","fileName","getFileNameFromHandle","handle","size","uniqueId","stream","ChunkedStreamReader","from","to","getRawPlatformaInstance","error","resolve","processRequest","request","update","current","progressesRef","ref","useClickOutside"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlBtnExportArchive.vue2.js","sources":["../../../src/components/PlBtnExportArchive/PlBtnExportArchive.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlIcon16,\n PlIcon24,\n useClickOutside,\n} from '@milaboratories/uikit';\nimport { ZipWriter } from '@zip.js/zip.js';\nimport { reactive, computed, ref } from 'vue';\nimport type { ExportItem, ExportsMap, FileExportEntry } from './types';\nimport Item from './Item.vue';\nimport { getFileNameFromHandle, ChunkedStreamReader } from '@platforma-sdk/model';\nimport { getRawPlatformaInstance } from '@platforma-sdk/model';\nimport { uniqueId } from '@milaboratories/helpers';\nimport Summary from './Summary.vue';\n\ntype FilePickerAcceptType = {\n description?: string;\n accept?: Record<string, string[]>;\n};\n\nconst props = defineProps<{\n fileExports?: FileExportEntry[];\n suggestedFileName?: string;\n disabled?: boolean;\n filePickerTypes?: FilePickerAcceptType[];\n strategy?: 'parallel'; // default is sequential\n debugFn?: (fileName: string) => Promise<void>;\n}>();\n\nconst defaultData = () => ({\n loading: false,\n name: '',\n exports: undefined as ExportsMap | undefined,\n showExports: false,\n});\n\nconst data = reactive(defaultData());\n\nconst updateExportsItem = (id: string, partial: Partial<ExportItem>) => {\n const it = data.exports?.get(id);\n if (it) {\n data.exports?.set(id, { ...it, ...partial });\n }\n};\n\nconst isReadyToExport = computed(() => {\n return props.fileExports !== undefined && !props.disabled;\n});\n\nconst items = computed(() => {\n return Array.from(data.exports?.values() ?? []);\n});\n\nconst archive = computed<ExportItem>(() => {\n return {\n fileName: data.name,\n current: items.value.reduce((acc, item) => acc + item.current, 0),\n size: items.value.reduce((acc, item) => acc + item.size, 0),\n status: items.value.some((item) => item.status === 'in-progress') ? 'in-progress' : items.value.every((item) => item.status === 'completed') ? 'completed' : 'pending',\n hasErrors: items.value.some((item) => item.status === 'error'),\n };\n});\n\ntype ZipRequest = {\n id: string;\n fileName: string;\n size: number;\n stream: ReadableStream<Uint8Array>;\n};\n\nconst exportRawTsvs = async () => {\n if (data.loading) {\n data.showExports = true;\n return;\n }\n\n if (!isReadyToExport.value || !props.fileExports) {\n return;\n }\n\n const defaultFileName = `${new Date().toISOString().split('T')[0]}_Export.zip`;\n const defaultTypes = [{\n description: 'ZIP files',\n accept: {\n 'application/zip': ['.zip'],\n },\n }];\n\n // @ts-expect-error - type definition issue TODO: fix this\n const newHandle = await window.showSaveFilePicker({\n types: props.filePickerTypes || defaultTypes,\n suggestedName: props.suggestedFileName || defaultFileName,\n });\n\n data.loading = true;\n data.name = newHandle.name;\n data.showExports = true;\n data.exports = new Map();\n\n try {\n const writableStream = await newHandle.createWritable();\n const zip = new ZipWriter(writableStream, { keepOrder: true, zip64: true, bufferedWrite: false });\n try {\n const requests = [] as ZipRequest[];\n\n for (const entry of props.fileExports) {\n const { importHandle, blobHandle, fileName: customFileName } = entry;\n const fileName = customFileName ?? getFileNameFromHandle(importHandle);\n const { handle, size } = blobHandle;\n\n const id = uniqueId();\n\n data.exports?.set(id, { fileName, current: 0, size, status: 'pending' });\n\n const stream = ChunkedStreamReader.create({\n fetchChunk: async ({ from, to }) => {\n if (props.debugFn) {\n await props.debugFn(fileName);\n }\n\n return await getRawPlatformaInstance().blobDriver.getContent(handle, { from, to });\n },\n totalSize: size,\n onError: async (error) => {\n updateExportsItem(id, { status: 'error', error });\n await new Promise((resolve) => setTimeout(resolve, 1000)); // primitive for now\n return 'continue';\n },\n });\n\n // Create a chunked stream reader for efficient streaming\n requests.push({ id, fileName, size, stream });\n }\n\n const processRequest = async (request: ZipRequest) => {\n const { id, fileName, size, stream } = request;\n const update = (partial: Partial<ExportItem>) => {\n const it = data.exports?.get(id);\n if (it) {\n data.exports?.set(id, { ...it, ...partial });\n }\n };\n await zip.add(fileName, stream, {\n bufferedWrite: true,\n onstart: () => {\n update({ status: 'in-progress' });\n return undefined;\n },\n onprogress: (current: number) => {\n update({ current, status: 'in-progress' });\n return undefined;\n },\n onend() {\n update({ current: size, status: 'completed' });\n return undefined;\n },\n });\n };\n\n if (props.strategy === 'parallel') {\n await Promise.all(requests.map(processRequest));\n } else {\n for (const request of requests) {\n await processRequest(request);\n }\n }\n } finally {\n await zip.close().catch((error) => {\n console.error('Error closing zip', error);\n });\n }\n } finally {\n data.loading = false;\n }\n};\n\nconst progressesRef = ref();\n\nuseClickOutside([progressesRef], () => {\n data.showExports = false;\n});\n</script>\n\n<template>\n <PlBtnGhost\n :disabled=\"!isReadyToExport\" :loading=\"data.loading\" :class=\"{ [$style['has-exports']]: data.exports }\"\n @click.stop=\"exportRawTsvs\"\n >\n <slot />\n <template #append>\n <PlIcon24 :class=\"$style.icon\" name=\"download\" />\n </template>\n </PlBtnGhost>\n <Teleport to=\"body\">\n <div v-if=\"data.exports && data.showExports\" ref=\"progressesRef\" :class=\"$style.progresses\">\n <PlIcon16 :class=\"$style.close\" name=\"close\" @click.stop=\"data.showExports = false\" />\n <Summary :item=\"archive\" />\n <div :class=\"$style.itemsContainer\" class=\"pl-scrollable-y\">\n <Item v-for=\"item in data.exports?.values()\" :key=\"item.fileName\" :item=\"item\" />\n </div>\n </div>\n </Teleport>\n</template>\n\n<style module>\n.progresses {\n position: fixed;\n top: 8px;\n right: 8px;\n width: 350px;\n height: auto;\n max-height: 400px;\n overflow: auto;\n background: rgba(0, 0, 0, 0.85);\n border-radius: 8px;\n padding: 20px 8px 8px 20px;\n color: white;\n font-size: 12px;\n font-weight: 600;\n z-index: 1000;\n\n .itemsContainer {\n max-height: 300px;\n }\n\n .close {\n position: absolute;\n top: 8px;\n right: 8px;\n cursor: pointer;\n --icon-color: white;\n }\n}\n</style>\n"],"names":["props","__props","data","reactive","updateExportsItem","id","partial","it","_a","_b","isReadyToExport","computed","items","archive","acc","item","exportRawTsvs","defaultFileName","defaultTypes","newHandle","writableStream","zip","ZipWriter","requests","entry","importHandle","blobHandle","customFileName","fileName","getFileNameFromHandle","handle","size","uniqueId","stream","ChunkedStreamReader","from","to","getRawPlatformaInstance","error","resolve","processRequest","request","update","current","progressesRef","ref","useClickOutside","_createVNode","_unref","PlBtnGhost","_normalizeClass","$style","PlIcon24","_renderSlot","_ctx","_createBlock","_Teleport","_createElementBlock","PlIcon16","_cache","_withModifiers","$event","Summary","_createElementVNode","_openBlock","_Fragment","Item"],"mappings":"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"}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { prettyBytes as
|
|
3
|
-
const
|
|
1
|
+
import { defineComponent as u, createElementBlock as n, openBlock as m, normalizeClass as s, createElementVNode as l, createTextVNode as d, createCommentVNode as y, toDisplayString as a, unref as r } from "vue";
|
|
2
|
+
import { prettyBytes as o } from "../../lib/util/helpers/dist/prettyBytes.js";
|
|
3
|
+
const k = /* @__PURE__ */ u({
|
|
4
4
|
__name: "Summary",
|
|
5
5
|
props: {
|
|
6
6
|
item: {}
|
|
7
7
|
},
|
|
8
8
|
emits: ["cancel"],
|
|
9
|
-
setup(
|
|
10
|
-
return (
|
|
11
|
-
class: s(
|
|
9
|
+
setup(e, { emit: c }) {
|
|
10
|
+
return (t, i) => (m(), n("div", {
|
|
11
|
+
class: s(t.$style.summary)
|
|
12
12
|
}, [
|
|
13
|
-
|
|
14
|
-
class: s(
|
|
13
|
+
l("div", {
|
|
14
|
+
class: s(t.$style.name)
|
|
15
15
|
}, [
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
d(a(e.item.fileName), 1),
|
|
17
|
+
y("", !0)
|
|
18
18
|
], 2),
|
|
19
|
-
e.item.status === "in-progress" ? (
|
|
19
|
+
e.item.status === "in-progress" ? (m(), n("div", {
|
|
20
20
|
key: 0,
|
|
21
|
-
class: s(
|
|
21
|
+
class: s(t.$style.details)
|
|
22
22
|
}, [
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
], 2)) : e.item.status === "completed" ? (
|
|
23
|
+
l("span", null, a(r(o)(e.item.current, {})), 1),
|
|
24
|
+
i[1] || (i[1] = l("span", null, "/", -1)),
|
|
25
|
+
l("span", null, a(r(o)(e.item.size, {})), 1)
|
|
26
|
+
], 2)) : e.item.status === "completed" ? (m(), n("div", {
|
|
27
27
|
key: 1,
|
|
28
|
-
class: s(
|
|
28
|
+
class: s(t.$style.details)
|
|
29
29
|
}, [
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
], 2)) : (
|
|
30
|
+
i[2] || (i[2] = d(" Done ", -1)),
|
|
31
|
+
l("span", null, a(r(o)(e.item.size, {})), 1)
|
|
32
|
+
], 2)) : (m(), n("div", {
|
|
33
33
|
key: 2,
|
|
34
|
-
class: s(
|
|
34
|
+
class: s(t.$style.details)
|
|
35
35
|
}, " Pending ", 2))
|
|
36
36
|
], 2));
|
|
37
37
|
}
|
|
38
38
|
});
|
|
39
39
|
export {
|
|
40
|
-
|
|
40
|
+
k as default
|
|
41
41
|
};
|
|
42
42
|
//# sourceMappingURL=Summary.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Summary.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Summary.vue2.js","sources":["../../../src/components/PlBtnExportArchive/Summary.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ExportItem } from './types';\nimport { prettyBytes } from '@milaboratories/helpers';\n\ndefineProps<{\n item: ExportItem;\n}>();\n\nconst emit = defineEmits<{\n (e: 'cancel'): void;\n}>();\n</script>\n\n<template>\n <div\n :class=\"$style.summary\"\n >\n <div :class=\"$style.name\">{{ item.fileName }}<span v-if=\"false\" @click.stop=\"emit('cancel')\">[TODO: Cancel]</span></div>\n <div v-if=\"item.status === 'in-progress'\" :class=\"$style.details\">\n <span>{{ prettyBytes(item.current, {}) }}</span>\n <span>/</span>\n <span>{{ prettyBytes(item.size, {}) }}</span>\n </div>\n <div v-else-if=\"item.status === 'completed'\" :class=\"$style.details\">\n Done <span>{{ prettyBytes(item.size, {}) }}</span>\n </div>\n <div v-else :class=\"$style.details\">\n Pending\n </div>\n </div>\n</template>\n\n<style module>\n.summary {\n display: flex;\n flex-direction: column;\n margin-bottom: 8px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n padding-bottom: 8px;\n --name-font-size: 14px;\n --details-font-size: 12px;\n}\n\n.name {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--name-font-size);\n font-weight: 600;\n}\n.details {\n font-size: var(--details-font-size);\n font-weight: 400;\n color: rgba(255, 255, 255, 0.6);\n}\n</style>\n"],"names":["_createElementBlock","_normalizeClass","$style","_createElementVNode","_createTextVNode","_toDisplayString","__props","_unref","prettyBytes","_cache"],"mappings":";;;;;;;;;2BAcEA,EAeM,OAAA;AAAA,MAdH,OAAKC,EAAEC,EAAAA,OAAO,OAAO;AAAA,IAAA;MAEtBC,EAAwH,OAAA;AAAA,QAAlH,OAAKF,EAAEC,EAAAA,OAAO,IAAI;AAAA,MAAA;QAAKE,EAAAC,EAAAC,EAAA,KAAK,QAAQ,GAAA,CAAA;AAAA;;MAC/BA,EAAA,KAAK,WAAM,sBAAtBN,EAIM,OAAA;AAAA;QAJqC,OAAKC,EAAEC,EAAAA,OAAO,OAAO;AAAA,MAAA;QAC9DC,EAAgD,QAAA,MAAAE,EAAvCE,EAAAC,CAAA,EAAYF,EAAA,KAAK,SAAO,EAAA,CAAA,GAAA,CAAA;AAAA,QACjCG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAN,EAAc,cAAR,KAAC,EAAA;AAAA,QACPA,EAA6C,QAAA,MAAAE,EAApCE,EAAAC,CAAA,EAAYF,EAAA,KAAK,MAAI,CAAA,CAAA,CAAA,GAAA,CAAA;AAAA,MAAA,SAEhBA,EAAA,KAAK,WAAM,oBAA3BN,EAEM,OAAA;AAAA;QAFwC,OAAKC,EAAEC,EAAAA,OAAO,OAAO;AAAA,MAAA;0BAAE,UAC9D,EAAA;AAAA,QAAAC,EAA6C,QAAA,MAAAE,EAApCE,EAAAC,CAAA,EAAYF,EAAA,KAAK,MAAI,CAAA,CAAA,CAAA,GAAA,CAAA;AAAA,MAAA,eAErCN,EAEM,OAAA;AAAA;QAFO,OAAKC,EAAEC,EAAAA,OAAO,OAAO;AAAA,MAAA,GAAE,aAEpC,CAAA;AAAA,IAAA;;;"}
|
|
@@ -47,26 +47,26 @@ const E = { class: "d-flex flex-column gap-24" }, T = {
|
|
|
47
47
|
"onUpdate:modelValue": e[2] || (e[2] = (a) => d.value = a),
|
|
48
48
|
"close-on-outside-click": !1
|
|
49
49
|
}, {
|
|
50
|
-
title: u(() => e[3] || (e[3] = [
|
|
51
|
-
m("Add Filter")
|
|
52
|
-
])),
|
|
50
|
+
title: u(() => [...e[3] || (e[3] = [
|
|
51
|
+
m("Add Filter", -1)
|
|
52
|
+
])]),
|
|
53
53
|
actions: u(() => [
|
|
54
54
|
s(r(A), {
|
|
55
55
|
disabled: !l.value,
|
|
56
56
|
onClick: F
|
|
57
57
|
}, {
|
|
58
|
-
default: u(() => e[4] || (e[4] = [
|
|
59
|
-
m("Add Filter")
|
|
60
|
-
])),
|
|
58
|
+
default: u(() => [...e[4] || (e[4] = [
|
|
59
|
+
m("Add Filter", -1)
|
|
60
|
+
])]),
|
|
61
61
|
_: 1
|
|
62
62
|
}, 8, ["disabled"]),
|
|
63
63
|
s(r(U), {
|
|
64
64
|
"justify-center": !1,
|
|
65
65
|
onClick: p
|
|
66
66
|
}, {
|
|
67
|
-
default: u(() => e[5] || (e[5] = [
|
|
68
|
-
m("Cancel")
|
|
69
|
-
])),
|
|
67
|
+
default: u(() => [...e[5] || (e[5] = [
|
|
68
|
+
m("Cancel", -1)
|
|
69
|
+
])]),
|
|
70
70
|
_: 1
|
|
71
71
|
})
|
|
72
72
|
]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlTableAddFilterV2.vue.js","sources":["../../../src/components/PlTableFilters/PlTableAddFilterV2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n deepClone,\n} from '@milaboratories/helpers';\nimport {\n PlBtnGhost,\n PlBtnPrimary,\n PlDropdown,\n PlSlideModal,\n type ListOption,\n} from '@milaboratories/uikit';\nimport {\n computed,\n ref,\n watch,\n} from 'vue';\nimport {\n type PlDataTableFilterStateInternal,\n} from './types';\nimport {\n getFilterDefault,\n} from './filters_logic';\nimport PlTableFilterEntryV2 from './PlTableFilterEntryV2.vue';\n\nconst show = defineModel<boolean>({ required: true });\nconst props = defineProps<{\n filters: Readonly<PlDataTableFilterStateInternal[]>;\n setFilter(idx: number, filter: PlDataTableFilterStateInternal): void;\n}>();\n\nconst filterOptions = computed<ListOption<number>[]>(() => {\n return props.filters\n .map((s, i) => {\n return {\n value: i,\n text: s.label,\n };\n })\n .filter((o) => props.filters[o.value].filter === null);\n});\n\nconst newFilterIdx = ref<number>();\nconst newFilter = ref<PlDataTableFilterStateInternal | null>(null);\nwatch(\n () => newFilterIdx.value,\n (newFilterIdx) => {\n if (newFilterIdx === undefined) {\n newFilter.value = null;\n } else {\n const filterClone = deepClone(props.filters[newFilterIdx]);\n if (!filterClone.filter) {\n filterClone.filter = {\n value: filterClone.defaultFilter ?? getFilterDefault(filterClone.options[0].value),\n disabled: false,\n open: true,\n };\n }\n newFilter.value = filterClone;\n }\n },\n);\nconst discardFilter = () => {\n newFilterIdx.value = undefined;\n show.value = false;\n};\nconst applyFilter = () => {\n if (newFilterIdx.value !== undefined && newFilter.value) {\n props.setFilter(newFilterIdx.value, newFilter.value);\n }\n discardFilter();\n};\n</script>\n\n<template>\n <PlSlideModal v-model=\"show\" :close-on-outside-click=\"false\">\n <template #title>Add Filter</template>\n <div class=\"d-flex flex-column gap-24\">\n <PlDropdown\n v-model=\"newFilterIdx\"\n :options=\"filterOptions\"\n label=\"Column\"\n placeholder=\"Choose...\"\n />\n <div\n v-if=\"newFilterIdx === undefined\"\n class=\"text-subtitle-m\"\n style=\"color: var(--txt-mask)\"\n >\n Choose a column to view and adjust its options\n </div>\n <PlTableFilterEntryV2\n v-if=\"newFilter\"\n v-model=\"newFilter\"\n />\n </div>\n <template #actions>\n <PlBtnPrimary :disabled=\"!newFilter\" @click=\"applyFilter\">Add Filter</PlBtnPrimary>\n <PlBtnGhost :justify-center=\"false\" @click=\"discardFilter\">Cancel</PlBtnGhost>\n </template>\n </PlSlideModal>\n</template>\n"],"names":["show","_useModel","__props","props","filterOptions","computed","s","i","newFilterIdx","ref","newFilter","watch","filterClone","deepClone","getFilterDefault","discardFilter","applyFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBA,UAAMA,IAAOC,EAAoBC,GAAA,YAAmB,GAC9CC,IAAQD,GAKRE,IAAgBC,EAA+B,MAC5CF,EAAM,QACV,IAAI,CAACG,GAAGC,OACA;AAAA,MACL,OAAOA;AAAA,MACP,MAAMD,EAAE;AAAA,IAAA,EAEX,EACA,OAAO,CAAC,MAAMH,EAAM,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,CACxD,GAEKK,IAAeC,EAAA,GACfC,IAAYD,EAA2C,IAAI;AACjE,IAAAE;AAAA,MACE,MAAMH,EAAa;AAAA,MACnB,CAACA,MAAiB;AAChB,YAAIA,MAAiB;AACnB,UAAAE,EAAU,QAAQ;AAAA,aACb;AACL,gBAAME,IAAcC,EAAUV,EAAM,QAAQK,CAAY,CAAC;AACzD,UAAKI,EAAY,WACfA,EAAY,SAAS;AAAA,YACnB,OAAOA,EAAY,iBAAiBE,EAAiBF,EAAY,QAAQ,CAAC,EAAE,KAAK;AAAA,YACjF,UAAU;AAAA,YACV,MAAM;AAAA,UAAA,IAGVF,EAAU,QAAQE;AAAA,QACpB;AAAA,MACF;AAAA,IAAA;AAEF,UAAMG,IAAgB,MAAM;AAC1B,MAAAP,EAAa,QAAQ,QACrBR,EAAK,QAAQ;AAAA,IACf,GACMgB,IAAc,MAAM;AACxB,MAAIR,EAAa,UAAU,UAAaE,EAAU,SAChDP,EAAM,UAAUK,EAAa,OAAOE,EAAU,KAAK,GAErDK,EAAA;AAAA,IACF
|
|
1
|
+
{"version":3,"file":"PlTableAddFilterV2.vue.js","sources":["../../../src/components/PlTableFilters/PlTableAddFilterV2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n deepClone,\n} from '@milaboratories/helpers';\nimport {\n PlBtnGhost,\n PlBtnPrimary,\n PlDropdown,\n PlSlideModal,\n type ListOption,\n} from '@milaboratories/uikit';\nimport {\n computed,\n ref,\n watch,\n} from 'vue';\nimport {\n type PlDataTableFilterStateInternal,\n} from './types';\nimport {\n getFilterDefault,\n} from './filters_logic';\nimport PlTableFilterEntryV2 from './PlTableFilterEntryV2.vue';\n\nconst show = defineModel<boolean>({ required: true });\nconst props = defineProps<{\n filters: Readonly<PlDataTableFilterStateInternal[]>;\n setFilter(idx: number, filter: PlDataTableFilterStateInternal): void;\n}>();\n\nconst filterOptions = computed<ListOption<number>[]>(() => {\n return props.filters\n .map((s, i) => {\n return {\n value: i,\n text: s.label,\n };\n })\n .filter((o) => props.filters[o.value].filter === null);\n});\n\nconst newFilterIdx = ref<number>();\nconst newFilter = ref<PlDataTableFilterStateInternal | null>(null);\nwatch(\n () => newFilterIdx.value,\n (newFilterIdx) => {\n if (newFilterIdx === undefined) {\n newFilter.value = null;\n } else {\n const filterClone = deepClone(props.filters[newFilterIdx]);\n if (!filterClone.filter) {\n filterClone.filter = {\n value: filterClone.defaultFilter ?? getFilterDefault(filterClone.options[0].value),\n disabled: false,\n open: true,\n };\n }\n newFilter.value = filterClone;\n }\n },\n);\nconst discardFilter = () => {\n newFilterIdx.value = undefined;\n show.value = false;\n};\nconst applyFilter = () => {\n if (newFilterIdx.value !== undefined && newFilter.value) {\n props.setFilter(newFilterIdx.value, newFilter.value);\n }\n discardFilter();\n};\n</script>\n\n<template>\n <PlSlideModal v-model=\"show\" :close-on-outside-click=\"false\">\n <template #title>Add Filter</template>\n <div class=\"d-flex flex-column gap-24\">\n <PlDropdown\n v-model=\"newFilterIdx\"\n :options=\"filterOptions\"\n label=\"Column\"\n placeholder=\"Choose...\"\n />\n <div\n v-if=\"newFilterIdx === undefined\"\n class=\"text-subtitle-m\"\n style=\"color: var(--txt-mask)\"\n >\n Choose a column to view and adjust its options\n </div>\n <PlTableFilterEntryV2\n v-if=\"newFilter\"\n v-model=\"newFilter\"\n />\n </div>\n <template #actions>\n <PlBtnPrimary :disabled=\"!newFilter\" @click=\"applyFilter\">Add Filter</PlBtnPrimary>\n <PlBtnGhost :justify-center=\"false\" @click=\"discardFilter\">Cancel</PlBtnGhost>\n </template>\n </PlSlideModal>\n</template>\n"],"names":["show","_useModel","__props","props","filterOptions","computed","s","i","newFilterIdx","ref","newFilter","watch","filterClone","deepClone","getFilterDefault","discardFilter","applyFilter","_createBlock","_unref","PlSlideModal","$event","_cache","_createVNode","PlBtnPrimary","PlBtnGhost","_createElementVNode","_hoisted_1","PlDropdown","_createElementBlock","_hoisted_2","PlTableFilterEntryV2"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBA,UAAMA,IAAOC,EAAoBC,GAAA,YAAmB,GAC9CC,IAAQD,GAKRE,IAAgBC,EAA+B,MAC5CF,EAAM,QACV,IAAI,CAACG,GAAGC,OACA;AAAA,MACL,OAAOA;AAAA,MACP,MAAMD,EAAE;AAAA,IAAA,EAEX,EACA,OAAO,CAAC,MAAMH,EAAM,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,CACxD,GAEKK,IAAeC,EAAA,GACfC,IAAYD,EAA2C,IAAI;AACjE,IAAAE;AAAA,MACE,MAAMH,EAAa;AAAA,MACnB,CAACA,MAAiB;AAChB,YAAIA,MAAiB;AACnB,UAAAE,EAAU,QAAQ;AAAA,aACb;AACL,gBAAME,IAAcC,EAAUV,EAAM,QAAQK,CAAY,CAAC;AACzD,UAAKI,EAAY,WACfA,EAAY,SAAS;AAAA,YACnB,OAAOA,EAAY,iBAAiBE,EAAiBF,EAAY,QAAQ,CAAC,EAAE,KAAK;AAAA,YACjF,UAAU;AAAA,YACV,MAAM;AAAA,UAAA,IAGVF,EAAU,QAAQE;AAAA,QACpB;AAAA,MACF;AAAA,IAAA;AAEF,UAAMG,IAAgB,MAAM;AAC1B,MAAAP,EAAa,QAAQ,QACrBR,EAAK,QAAQ;AAAA,IACf,GACMgB,IAAc,MAAM;AACxB,MAAIR,EAAa,UAAU,UAAaE,EAAU,SAChDP,EAAM,UAAUK,EAAa,OAAOE,EAAU,KAAK,GAErDK,EAAA;AAAA,IACF;2BAIEE,EAyBeC,EAAAC,CAAA,GAAA;AAAA,kBAzBQnB,EAAA;AAAA,oDAAAA,EAAI,QAAAoB;AAAA,MAAG,0BAAwB;AAAA,IAAA;MACzC,SAAM,MAAU,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,UAAV,cAAU,EAAA;AAAA,MAAA;MAoBhB,WACT,MAAmF;AAAA,QAAnFC,EAAmFJ,EAAAK,CAAA,GAAA;AAAA,UAApE,WAAWb,EAAA;AAAA,UAAY,SAAOM;AAAA,QAAA;qBAAa,MAAU,CAAA,GAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAAV,cAAU,EAAA;AAAA,UAAA;;;QACpEC,EAA8EJ,EAAAM,CAAA,GAAA;AAAA,UAAjE,kBAAgB;AAAA,UAAQ,SAAOT;AAAA,QAAA;qBAAe,MAAM,CAAA,GAAAM,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAAN,UAAM,EAAA;AAAA,UAAA;;;;iBArBnE,MAkBM;AAAA,QAlBNI,EAkBM,OAlBNC,GAkBM;AAAA,UAjBJJ,EAKEJ,EAAAS,CAAA,GAAA;AAAA,wBAJSnB,EAAA;AAAA,0DAAAA,EAAY,QAAAY;AAAA,YACpB,SAAShB,EAAA;AAAA,YACV,OAAM;AAAA,YACN,aAAY;AAAA,UAAA;UAGNI,EAAA,UAAiB,eADzBoB,EAMM,OANNC,GAIC,kDAED;UAEQnB,EAAA,cADRO,EAGEa,GAAA;AAAA;wBADSpB,EAAA;AAAA,0DAAAA,EAAS,QAAAU;AAAA,UAAA;;;;;;;"}
|
|
@@ -127,9 +127,9 @@ const O = {
|
|
|
127
127
|
icon: "reverse",
|
|
128
128
|
onClick: a[13] || (a[13] = (l) => e.value.filter.value = e.value.defaultFilter)
|
|
129
129
|
}, {
|
|
130
|
-
default: U(() => a[14] || (a[14] = [
|
|
131
|
-
k(" Revert Settings to Default ")
|
|
132
|
-
])),
|
|
130
|
+
default: U(() => [...a[14] || (a[14] = [
|
|
131
|
+
k(" Revert Settings to Default ", -1)
|
|
132
|
+
])]),
|
|
133
133
|
_: 1
|
|
134
134
|
}, 8, ["disabled"])
|
|
135
135
|
])) : d("", !0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlTableFilterEntryV2.vue.js","sources":["../../../src/components/PlTableFilters/PlTableFilterEntryV2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlDropdown,\n PlTextField,\n PlToggleSwitch,\n Slider,\n PlBtnGhost,\n} from '@milaboratories/uikit';\nimport { isJsonEqual } from '@milaboratories/helpers';\nimport {\n changeFilter,\n parseNumber,\n parseString,\n parseRegex,\n makeWildcardOptions,\n isFilterDiscrete,\n getFilterDefault,\n} from './filters_logic';\nimport type { PlDataTableFilterStateInternal } from './types';\nimport { watchEffect } from 'vue';\n\nconst entry = defineModel<PlDataTableFilterStateInternal>({ required: true });\nwatchEffect(() => {\n if (!entry.value.filter) {\n entry.value.filter = {\n value: getFilterDefault(entry.value.options[0].value),\n disabled: false,\n open: true,\n };\n }\n});\n</script>\n\n<template>\n <div v-if=\"entry.filter\" class=\"d-flex flex-column gap-24\">\n <PlDropdown\n :model-value=\"entry.filter.value.type\"\n :options=\"entry.options\"\n :disabled=\"entry.filter.disabled\"\n label=\"Predicate\"\n @update:model-value=\"(type) => (entry.filter!.value = changeFilter(entry.filter!.value, type!, entry.discreteOptions))\"\n />\n\n <template v-if=\"entry.discreteOptions.length > 0 && isFilterDiscrete(entry.filter.value)\">\n <PlDropdown\n v-model=\"entry.filter.value.reference\"\n :options=\"entry.discreteOptions\"\n />\n </template>\n <template v-else>\n <template\n v-if=\"\n entry.filter.value.type === 'number_equals' ||\n entry.filter.value.type === 'number_notEquals' ||\n entry.filter.value.type === 'number_lessThan' ||\n entry.filter.value.type === 'number_lessThanOrEqualTo' ||\n entry.filter.value.type === 'number_greaterThan' ||\n entry.filter.value.type === 'number_greaterThanOrEqualTo'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): number => parseNumber(entry.spec, value)\"\n label=\"Reference value\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'number_between'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.lowerBound\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): number => parseNumber(entry.spec, value)\"\n label=\"Lower bound\"\n />\n <PlToggleSwitch\n v-model=\"entry.filter.value.includeLowerBound\"\n :disabled=\"entry.filter.disabled\"\n label=\"Include lower bound\"\n />\n <PlTextField\n v-model=\"entry.filter.value.upperBound\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): number => parseNumber(entry.spec, value)\"\n label=\"Upper bound\"\n />\n <PlToggleSwitch\n v-model=\"entry.filter.value.includeUpperBound\"\n :disabled=\"entry.filter.disabled\"\n label=\"Include upper bound\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'string_equals' ||\n entry.filter.value.type === 'string_notEquals' ||\n entry.filter.value.type === 'string_contains' ||\n entry.filter.value.type === 'string_doesNotContain'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): string => parseString(entry.spec, value)\"\n label=\"Reference value\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'string_matches' ||\n entry.filter.value.type === 'string_doesNotMatch'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"parseRegex\"\n label=\"Reference value\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'string_containsFuzzyMatch'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): string => parseString(entry.spec, value)\"\n label=\"Reference value\"\n />\n <Slider\n v-model=\"entry.filter.value.maxEdits\"\n :max=\"5\"\n :disabled=\"entry.filter.disabled\"\n breakpoints label=\"Maximum nuber of substitutions and indels\"\n />\n <PlToggleSwitch\n v-model=\"entry.filter.value.substitutionsOnly\"\n :disabled=\"entry.filter.disabled\"\n label=\"Substitutions only\"\n />\n <PlDropdown\n v-model=\"entry.filter.value.wildcard\"\n :disabled=\"entry.filter.disabled\"\n :options=\"makeWildcardOptions(entry.spec, entry.filter.value.reference)\"\n clearable\n label=\"Wildcard symbol\"\n />\n </template>\n </template>\n\n <div v-if=\"entry.defaultFilter\" class=\"d-flex justify-center\">\n <PlBtnGhost\n :disabled=\"entry.filter.disabled || isJsonEqual(entry.filter.value, entry.defaultFilter)\"\n icon=\"reverse\"\n @click=\"entry.filter.value = entry.defaultFilter\"\n >\n Revert Settings to Default\n </PlBtnGhost>\n </div>\n </div>\n</template>\n"],"names":["entry","_useModel","__props","watchEffect","getFilterDefault"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,UAAMA,IAAQC,EAA2CC,GAAA,YAAmB;AAC5E,WAAAC,EAAY,MAAM;AAChB,MAAKH,EAAM,MAAM,WACfA,EAAM,MAAM,SAAS;AAAA,QACnB,OAAOI,EAAiBJ,EAAM,MAAM,QAAQ,CAAC,EAAE,KAAK;AAAA,QACpD,UAAU;AAAA,QACV,MAAM;AAAA,MAAA;AAAA,IAGZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"PlTableFilterEntryV2.vue.js","sources":["../../../src/components/PlTableFilters/PlTableFilterEntryV2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlDropdown,\n PlTextField,\n PlToggleSwitch,\n Slider,\n PlBtnGhost,\n} from '@milaboratories/uikit';\nimport { isJsonEqual } from '@milaboratories/helpers';\nimport {\n changeFilter,\n parseNumber,\n parseString,\n parseRegex,\n makeWildcardOptions,\n isFilterDiscrete,\n getFilterDefault,\n} from './filters_logic';\nimport type { PlDataTableFilterStateInternal } from './types';\nimport { watchEffect } from 'vue';\n\nconst entry = defineModel<PlDataTableFilterStateInternal>({ required: true });\nwatchEffect(() => {\n if (!entry.value.filter) {\n entry.value.filter = {\n value: getFilterDefault(entry.value.options[0].value),\n disabled: false,\n open: true,\n };\n }\n});\n</script>\n\n<template>\n <div v-if=\"entry.filter\" class=\"d-flex flex-column gap-24\">\n <PlDropdown\n :model-value=\"entry.filter.value.type\"\n :options=\"entry.options\"\n :disabled=\"entry.filter.disabled\"\n label=\"Predicate\"\n @update:model-value=\"(type) => (entry.filter!.value = changeFilter(entry.filter!.value, type!, entry.discreteOptions))\"\n />\n\n <template v-if=\"entry.discreteOptions.length > 0 && isFilterDiscrete(entry.filter.value)\">\n <PlDropdown\n v-model=\"entry.filter.value.reference\"\n :options=\"entry.discreteOptions\"\n />\n </template>\n <template v-else>\n <template\n v-if=\"\n entry.filter.value.type === 'number_equals' ||\n entry.filter.value.type === 'number_notEquals' ||\n entry.filter.value.type === 'number_lessThan' ||\n entry.filter.value.type === 'number_lessThanOrEqualTo' ||\n entry.filter.value.type === 'number_greaterThan' ||\n entry.filter.value.type === 'number_greaterThanOrEqualTo'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): number => parseNumber(entry.spec, value)\"\n label=\"Reference value\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'number_between'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.lowerBound\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): number => parseNumber(entry.spec, value)\"\n label=\"Lower bound\"\n />\n <PlToggleSwitch\n v-model=\"entry.filter.value.includeLowerBound\"\n :disabled=\"entry.filter.disabled\"\n label=\"Include lower bound\"\n />\n <PlTextField\n v-model=\"entry.filter.value.upperBound\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): number => parseNumber(entry.spec, value)\"\n label=\"Upper bound\"\n />\n <PlToggleSwitch\n v-model=\"entry.filter.value.includeUpperBound\"\n :disabled=\"entry.filter.disabled\"\n label=\"Include upper bound\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'string_equals' ||\n entry.filter.value.type === 'string_notEquals' ||\n entry.filter.value.type === 'string_contains' ||\n entry.filter.value.type === 'string_doesNotContain'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): string => parseString(entry.spec, value)\"\n label=\"Reference value\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'string_matches' ||\n entry.filter.value.type === 'string_doesNotMatch'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"parseRegex\"\n label=\"Reference value\"\n />\n </template>\n\n <template\n v-if=\"\n entry.filter.value.type === 'string_containsFuzzyMatch'\n \"\n >\n <PlTextField\n v-model=\"entry.filter.value.reference\"\n :disabled=\"entry.filter.disabled\"\n :parse=\"(value: string): string => parseString(entry.spec, value)\"\n label=\"Reference value\"\n />\n <Slider\n v-model=\"entry.filter.value.maxEdits\"\n :max=\"5\"\n :disabled=\"entry.filter.disabled\"\n breakpoints label=\"Maximum nuber of substitutions and indels\"\n />\n <PlToggleSwitch\n v-model=\"entry.filter.value.substitutionsOnly\"\n :disabled=\"entry.filter.disabled\"\n label=\"Substitutions only\"\n />\n <PlDropdown\n v-model=\"entry.filter.value.wildcard\"\n :disabled=\"entry.filter.disabled\"\n :options=\"makeWildcardOptions(entry.spec, entry.filter.value.reference)\"\n clearable\n label=\"Wildcard symbol\"\n />\n </template>\n </template>\n\n <div v-if=\"entry.defaultFilter\" class=\"d-flex justify-center\">\n <PlBtnGhost\n :disabled=\"entry.filter.disabled || isJsonEqual(entry.filter.value, entry.defaultFilter)\"\n icon=\"reverse\"\n @click=\"entry.filter.value = entry.defaultFilter\"\n >\n Revert Settings to Default\n </PlBtnGhost>\n </div>\n </div>\n</template>\n"],"names":["entry","_useModel","__props","watchEffect","getFilterDefault","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","PlDropdown","_cache","type","changeFilter","isFilterDiscrete","_createBlock","$event","_Fragment","PlTextField","value","parseNumber","PlToggleSwitch","parseString","parseRegex","Slider","makeWildcardOptions","_hoisted_2","PlBtnGhost","isJsonEqual"],"mappings":"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"}
|
|
@@ -55,9 +55,9 @@ const le = ["disabled"], te = { key: 1 }, ue = /* @__PURE__ */ D({
|
|
|
55
55
|
icon: N.value ? "filter-on" : "filter",
|
|
56
56
|
onClick: t[0] || (t[0] = $((l) => c.value = !0, ["stop"]))
|
|
57
57
|
}, {
|
|
58
|
-
default: d(() => t[5] || (t[5] = [
|
|
59
|
-
p(" Filters ")
|
|
60
|
-
])),
|
|
58
|
+
default: d(() => [...t[5] || (t[5] = [
|
|
59
|
+
p(" Filters ", -1)
|
|
60
|
+
])]),
|
|
61
61
|
_: 1
|
|
62
62
|
}, 8, ["icon"])
|
|
63
63
|
], 8, ["to"])) : V("", !0),
|
|
@@ -66,9 +66,9 @@ const le = ["disabled"], te = { key: 1 }, ue = /* @__PURE__ */ D({
|
|
|
66
66
|
"onUpdate:modelValue": t[3] || (t[3] = (l) => c.value = l),
|
|
67
67
|
"close-on-outside-click": !1
|
|
68
68
|
}, {
|
|
69
|
-
title: d(() => t[6] || (t[6] = [
|
|
70
|
-
p("Manage Filters")
|
|
71
|
-
])),
|
|
69
|
+
title: d(() => [...t[6] || (t[6] = [
|
|
70
|
+
p("Manage Filters", -1)
|
|
71
|
+
])]),
|
|
72
72
|
default: d(() => [
|
|
73
73
|
k("div", {
|
|
74
74
|
ref_key: "filterManager",
|
|
@@ -127,9 +127,9 @@ const le = ["disabled"], te = { key: 1 }, ue = /* @__PURE__ */ D({
|
|
|
127
127
|
disabled: !x.value,
|
|
128
128
|
onClick: $(z, ["stop"])
|
|
129
129
|
}, {
|
|
130
|
-
default: d(() => t[7] || (t[7] = [
|
|
131
|
-
p(" Reset to defaults ")
|
|
132
|
-
])),
|
|
130
|
+
default: d(() => [...t[7] || (t[7] = [
|
|
131
|
+
p(" Reset to defaults ", -1)
|
|
132
|
+
])]),
|
|
133
133
|
_: 1
|
|
134
134
|
}, 8, ["disabled"])
|
|
135
135
|
], 2)) : V("", !0),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlTableFiltersV2.vue2.js","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport {\n type PlDataTableFilterState,\n canonicalizeJson,\n type PTableColumnId,\n} from '@platforma-sdk/model';\nimport type {\n PlDataTableFiltersSettings,\n} from './types';\nimport {\n computed,\n onBeforeUnmount,\n onMounted,\n ref,\n toRefs,\n watch,\n} from 'vue';\nimport {\n PlBtnGhost,\n PlSlideModal,\n PlBtnSecondary,\n PlMaskIcon16,\n PlElementList,\n usePlBlockPageTitleTeleportTarget,\n} from '@milaboratories/uikit';\nimport { useFilters } from './filters-state';\nimport PlTableAddFilterV2 from './PlTableAddFilterV2.vue';\nimport PlTableFilterEntryV2 from './PlTableFilterEntryV2.vue';\nimport { isJsonEqual } from '@milaboratories/helpers';\n\nconst state = defineModel<PlDataTableFilterState[]>({\n default: [],\n});\nconst props = defineProps<{\n settings: Readonly<PlDataTableFiltersSettings>;\n}>();\nconst { settings } = toRefs(props);\n\nconst filters = useFilters(settings, state);\n\nconst filtersOn = computed<boolean>(() => filters.value.some((s) => s.filter && !s.filter.disabled));\n\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget('PlTableFiltersV2');\n\nconst showManager = ref(false);\n\nconst scrollIsActive = ref(false);\nconst filterManager = ref<HTMLElement>();\nlet observer: ResizeObserver;\nonMounted(() => {\n observer = new ResizeObserver(() => {\n const parent = filterManager.value?.parentElement;\n if (!parent) return;\n scrollIsActive.value = parent.scrollHeight > parent.clientHeight || parent.scrollWidth > parent.clientWidth;\n });\n if (filterManager.value && filterManager.value.parentElement) {\n observer.observe(filterManager.value!.parentElement);\n }\n});\n\nwatch(filterManager, (newElement, oldElement) => {\n if (oldElement?.parentElement) {\n observer.unobserve(oldElement.parentElement);\n }\n if (newElement?.parentElement) {\n observer.observe(newElement.parentElement);\n }\n});\n\nonBeforeUnmount(() => {\n if (observer !== undefined) {\n observer.disconnect();\n }\n});\n\nconst canAddFilter = computed<boolean>(() => filters.value.some((s) => !s.filter));\nconst showAddFilter = ref(false);\n\nconst canResetToDefaults = computed<boolean>(() => {\n return filters.value\n .some((s) => (!s.defaultFilter && s.filter) || (s.defaultFilter\n && (s.filter?.disabled === true || !isJsonEqual(s.filter?.value, s.defaultFilter))));\n});\nconst resetToDefaults = () => {\n filters.value.forEach((s) => {\n if (s.defaultFilter) {\n s.filter = {\n value: s.defaultFilter,\n disabled: false,\n open: false,\n };\n } else {\n s.filter = null;\n }\n });\n};\n\nconst items = computed(() => filters.value.filter((s) => s.filter !== null));\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div ref=\"filterManager\" :class=\"$style['filter-manager']\">\n <PlElementList\n v-model:items=\"items\"\n :on-expand=\"(item) => {\n if (item.filter) {\n item.filter.open = !item.filter.open;\n }\n }\"\n :is-expanded=\"(item) => item.filter?.open ?? false\"\n :on-toggle=\"(item) => {\n if (item.filter) {\n item.filter.disabled = !item.filter.disabled;\n }\n }\"\n :is-toggled=\"(item) => item.filter?.disabled ?? false\"\n :on-remove=\"(item) => {\n if (item.filter) {\n item.filter = null;\n }\n }\"\n :get-item-key=\"(item) => canonicalizeJson<PTableColumnId>(item.id)\"\n disable-dragging\n >\n <template #item-title=\"{ item }\">\n {{ item.label }}\n </template>\n <template #item-content=\"{ index }\">\n <PlTableFilterEntryV2 v-model=\"filters.value[index]\" />\n </template>\n </PlElementList>\n\n <div\n v-if=\"filters.value.length\"\n :class=\"$style['add-action-wrapper']\"\n >\n <button\n :disabled=\"!canAddFilter\"\n :class=\"$style['add-btn']\"\n @click=\"showAddFilter = true\"\n >\n <PlMaskIcon16 name=\"add\" />\n <div :class=\"$style['add-btn-title']\">Add Filter</div>\n </button>\n\n <PlBtnSecondary\n :disabled=\"!canResetToDefaults\"\n @click.stop=\"resetToDefaults\"\n >\n Reset to defaults\n </PlBtnSecondary>\n </div>\n\n <div v-if=\"!filters.value.length\">No filters applicable</div>\n </div>\n </PlSlideModal>\n\n <PlTableAddFilterV2\n v-model=\"showAddFilter\"\n :filters=\"filters.value\"\n :set-filter=\"(idx, filter) => filters.value[idx] = filter\"\n />\n</template>\n\n<style lang=\"scss\" module>\n.filter-manager {\n --expand-icon-rotation: rotate(0deg);\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.add-action-wrapper {\n position: sticky;\n bottom: -16px;\n background-color: var(--bg-elevated-01);\n transition: all .15s ease-in-out;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.add-btn {\n height: 40px;\n background-color: var(--bg-elevated-01);\n display: flex;\n align-items: center;\n gap: 8px;\n padding-left: 12px;\n padding-right: 12px;\n border-radius: 6px;\n border: 1px dashed var(--border-color-div-grey);\n line-height: 0;\n cursor: pointer;\n text-align: left;\n}\n\n.add-btn:disabled {\n --icon-color: var(--dis-01);\n cursor: auto;\n}\n\n.add-btn:not([disabled]):hover {\n border-radius: 6px;\n border: 1px dashed var(--border-color-focus, #49CC49);\n background: rgba(99, 224, 36, 0.12);\n}\n\n.add-btn-title {\n flex-grow: 1;\n font-weight: 600;\n}\n\n.expand-icon {\n transition: all .15s ease-in-out;\n transform: var(--expand-icon-rotation);\n line-height: 0;\n cursor: pointer;\n}\n\n.toggle,\n.delete {\n line-height: 0;\n cursor: pointer;\n display: none;\n}\n\n.toggle .mask-24,\n.delete .mask-24 {\n --icon-color: var(--ic-02);\n}\n\n.toggle:hover .mask-24 {\n --icon-color: var(--ic-01);\n}\n\n.delete:hover .mask-24 {\n --icon-color: var(--ic-01);\n}\n\n.filter:hover .toggle,\n.filter:hover .delete {\n display: block;\n}\n\n.filter {\n border-radius: 6px;\n border: 1px solid var(--border-color-div-grey);\n background-color: var(--bg-base-light);\n transition: background-color .15s ease-in-out;\n overflow: auto;\n}\n\n.filter.disabled .expand-icon,\n.filter.disabled .title {\n opacity: 0.3;\n}\n\n.filter:hover {\n background-color: var(--bg-elevated-01);\n}\n\n.filter:global(.open) {\n background-color: var(--bg-elevated-01);\n --expand-icon-rotation: rotate(90deg);\n}\n</style>\n"],"names":["state","_useModel","props","__props","settings","toRefs","filters","useFilters","filtersOn","computed","s","mounted","ref","onMounted","teleportTarget","usePlBlockPageTitleTeleportTarget","showManager","scrollIsActive","filterManager","observer","parent","_a","watch","newElement","oldElement","onBeforeUnmount","canAddFilter","showAddFilter","canResetToDefaults","isJsonEqual","_b","resetToDefaults","items"],"mappings":";;;;;;;;;;;;;;;;;;;AA8BA,UAAMA,IAAQC,iBAEb,GACKC,IAAQC,GAGR,EAAE,UAAAC,EAAA,IAAaC,EAAOH,CAAK,GAE3BI,IAAUC,EAAWH,GAAUJ,CAAK,GAEpCQ,IAAYC,EAAkB,MAAMH,EAAQ,MAAM,KAAK,CAACI,MAAMA,EAAE,UAAU,CAACA,EAAE,OAAO,QAAQ,CAAC,GAE7FC,IAAUC,EAAI,EAAK;AACzB,IAAAC,EAAU,MAAM;AACd,MAAAF,EAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,UAAMG,IAAiBC,EAAkC,kBAAkB,GAErEC,IAAcJ,EAAI,EAAK,GAEvBK,IAAiBL,EAAI,EAAK,GAC1BM,IAAgBN,EAAA;AACtB,QAAIO;AACJ,IAAAN,EAAU,MAAM;AACd,MAAAM,IAAW,IAAI,eAAe,MAAM;;AAClC,cAAMC,KAASC,IAAAH,EAAc,UAAd,gBAAAG,EAAqB;AACpC,QAAKD,MACLH,EAAe,QAAQG,EAAO,eAAeA,EAAO,gBAAgBA,EAAO,cAAcA,EAAO;AAAA,MAClG,CAAC,GACGF,EAAc,SAASA,EAAc,MAAM,iBAC7CC,EAAS,QAAQD,EAAc,MAAO,aAAa;AAAA,IAEvD,CAAC,GAEDI,EAAMJ,GAAe,CAACK,GAAYC,MAAe;AAC/C,MAAIA,KAAA,QAAAA,EAAY,iBACdL,EAAS,UAAUK,EAAW,aAAa,GAEzCD,KAAA,QAAAA,EAAY,iBACdJ,EAAS,QAAQI,EAAW,aAAa;AAAA,IAE7C,CAAC,GAEDE,EAAgB,MAAM;AACpB,MAAIN,MAAa,UACfA,EAAS,WAAA;AAAA,IAEb,CAAC;AAED,UAAMO,IAAejB,EAAkB,MAAMH,EAAQ,MAAM,KAAK,CAACI,MAAM,CAACA,EAAE,MAAM,CAAC,GAC3EiB,IAAgBf,EAAI,EAAK,GAEzBgB,IAAqBnB,EAAkB,MACpCH,EAAQ,MACZ,KAAK,CAACI;;AAAO,cAACA,EAAE,iBAAiBA,EAAE,UAAYA,EAAE,oBAC5CW,IAAAX,EAAE,WAAF,gBAAAW,EAAU,cAAa,MAAQ,CAACQ,IAAYC,IAAApB,EAAE,WAAF,gBAAAoB,EAAU,OAAOpB,EAAE,aAAa;AAAA,KAAG,CACxF,GACKqB,IAAkB,MAAM;AAC5B,MAAAzB,EAAQ,MAAM,QAAQ,CAACI,MAAM;AAC3B,QAAIA,EAAE,gBACJA,EAAE,SAAS;AAAA,UACT,OAAOA,EAAE;AAAA,UACT,UAAU;AAAA,UACV,MAAM;AAAA,QAAA,IAGRA,EAAE,SAAS;AAAA,MAEf,CAAC;AAAA,IACH,GAEMsB,IAAQvB,EAAS,MAAMH,EAAQ,MAAM,OAAO,CAACI,MAAMA,EAAE,WAAW,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"PlTableFiltersV2.vue2.js","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport {\n type PlDataTableFilterState,\n canonicalizeJson,\n type PTableColumnId,\n} from '@platforma-sdk/model';\nimport type {\n PlDataTableFiltersSettings,\n} from './types';\nimport {\n computed,\n onBeforeUnmount,\n onMounted,\n ref,\n toRefs,\n watch,\n} from 'vue';\nimport {\n PlBtnGhost,\n PlSlideModal,\n PlBtnSecondary,\n PlMaskIcon16,\n PlElementList,\n usePlBlockPageTitleTeleportTarget,\n} from '@milaboratories/uikit';\nimport { useFilters } from './filters-state';\nimport PlTableAddFilterV2 from './PlTableAddFilterV2.vue';\nimport PlTableFilterEntryV2 from './PlTableFilterEntryV2.vue';\nimport { isJsonEqual } from '@milaboratories/helpers';\n\nconst state = defineModel<PlDataTableFilterState[]>({\n default: [],\n});\nconst props = defineProps<{\n settings: Readonly<PlDataTableFiltersSettings>;\n}>();\nconst { settings } = toRefs(props);\n\nconst filters = useFilters(settings, state);\n\nconst filtersOn = computed<boolean>(() => filters.value.some((s) => s.filter && !s.filter.disabled));\n\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget('PlTableFiltersV2');\n\nconst showManager = ref(false);\n\nconst scrollIsActive = ref(false);\nconst filterManager = ref<HTMLElement>();\nlet observer: ResizeObserver;\nonMounted(() => {\n observer = new ResizeObserver(() => {\n const parent = filterManager.value?.parentElement;\n if (!parent) return;\n scrollIsActive.value = parent.scrollHeight > parent.clientHeight || parent.scrollWidth > parent.clientWidth;\n });\n if (filterManager.value && filterManager.value.parentElement) {\n observer.observe(filterManager.value!.parentElement);\n }\n});\n\nwatch(filterManager, (newElement, oldElement) => {\n if (oldElement?.parentElement) {\n observer.unobserve(oldElement.parentElement);\n }\n if (newElement?.parentElement) {\n observer.observe(newElement.parentElement);\n }\n});\n\nonBeforeUnmount(() => {\n if (observer !== undefined) {\n observer.disconnect();\n }\n});\n\nconst canAddFilter = computed<boolean>(() => filters.value.some((s) => !s.filter));\nconst showAddFilter = ref(false);\n\nconst canResetToDefaults = computed<boolean>(() => {\n return filters.value\n .some((s) => (!s.defaultFilter && s.filter) || (s.defaultFilter\n && (s.filter?.disabled === true || !isJsonEqual(s.filter?.value, s.defaultFilter))));\n});\nconst resetToDefaults = () => {\n filters.value.forEach((s) => {\n if (s.defaultFilter) {\n s.filter = {\n value: s.defaultFilter,\n disabled: false,\n open: false,\n };\n } else {\n s.filter = null;\n }\n });\n};\n\nconst items = computed(() => filters.value.filter((s) => s.filter !== null));\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div ref=\"filterManager\" :class=\"$style['filter-manager']\">\n <PlElementList\n v-model:items=\"items\"\n :on-expand=\"(item) => {\n if (item.filter) {\n item.filter.open = !item.filter.open;\n }\n }\"\n :is-expanded=\"(item) => item.filter?.open ?? false\"\n :on-toggle=\"(item) => {\n if (item.filter) {\n item.filter.disabled = !item.filter.disabled;\n }\n }\"\n :is-toggled=\"(item) => item.filter?.disabled ?? false\"\n :on-remove=\"(item) => {\n if (item.filter) {\n item.filter = null;\n }\n }\"\n :get-item-key=\"(item) => canonicalizeJson<PTableColumnId>(item.id)\"\n disable-dragging\n >\n <template #item-title=\"{ item }\">\n {{ item.label }}\n </template>\n <template #item-content=\"{ index }\">\n <PlTableFilterEntryV2 v-model=\"filters.value[index]\" />\n </template>\n </PlElementList>\n\n <div\n v-if=\"filters.value.length\"\n :class=\"$style['add-action-wrapper']\"\n >\n <button\n :disabled=\"!canAddFilter\"\n :class=\"$style['add-btn']\"\n @click=\"showAddFilter = true\"\n >\n <PlMaskIcon16 name=\"add\" />\n <div :class=\"$style['add-btn-title']\">Add Filter</div>\n </button>\n\n <PlBtnSecondary\n :disabled=\"!canResetToDefaults\"\n @click.stop=\"resetToDefaults\"\n >\n Reset to defaults\n </PlBtnSecondary>\n </div>\n\n <div v-if=\"!filters.value.length\">No filters applicable</div>\n </div>\n </PlSlideModal>\n\n <PlTableAddFilterV2\n v-model=\"showAddFilter\"\n :filters=\"filters.value\"\n :set-filter=\"(idx, filter) => filters.value[idx] = filter\"\n />\n</template>\n\n<style lang=\"scss\" module>\n.filter-manager {\n --expand-icon-rotation: rotate(0deg);\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.add-action-wrapper {\n position: sticky;\n bottom: -16px;\n background-color: var(--bg-elevated-01);\n transition: all .15s ease-in-out;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.add-btn {\n height: 40px;\n background-color: var(--bg-elevated-01);\n display: flex;\n align-items: center;\n gap: 8px;\n padding-left: 12px;\n padding-right: 12px;\n border-radius: 6px;\n border: 1px dashed var(--border-color-div-grey);\n line-height: 0;\n cursor: pointer;\n text-align: left;\n}\n\n.add-btn:disabled {\n --icon-color: var(--dis-01);\n cursor: auto;\n}\n\n.add-btn:not([disabled]):hover {\n border-radius: 6px;\n border: 1px dashed var(--border-color-focus, #49CC49);\n background: rgba(99, 224, 36, 0.12);\n}\n\n.add-btn-title {\n flex-grow: 1;\n font-weight: 600;\n}\n\n.expand-icon {\n transition: all .15s ease-in-out;\n transform: var(--expand-icon-rotation);\n line-height: 0;\n cursor: pointer;\n}\n\n.toggle,\n.delete {\n line-height: 0;\n cursor: pointer;\n display: none;\n}\n\n.toggle .mask-24,\n.delete .mask-24 {\n --icon-color: var(--ic-02);\n}\n\n.toggle:hover .mask-24 {\n --icon-color: var(--ic-01);\n}\n\n.delete:hover .mask-24 {\n --icon-color: var(--ic-01);\n}\n\n.filter:hover .toggle,\n.filter:hover .delete {\n display: block;\n}\n\n.filter {\n border-radius: 6px;\n border: 1px solid var(--border-color-div-grey);\n background-color: var(--bg-base-light);\n transition: background-color .15s ease-in-out;\n overflow: auto;\n}\n\n.filter.disabled .expand-icon,\n.filter.disabled .title {\n opacity: 0.3;\n}\n\n.filter:hover {\n background-color: var(--bg-elevated-01);\n}\n\n.filter:global(.open) {\n background-color: var(--bg-elevated-01);\n --expand-icon-rotation: rotate(90deg);\n}\n</style>\n"],"names":["state","_useModel","props","__props","settings","toRefs","filters","useFilters","filtersOn","computed","s","mounted","ref","onMounted","teleportTarget","usePlBlockPageTitleTeleportTarget","showManager","scrollIsActive","filterManager","observer","parent","_a","watch","newElement","oldElement","onBeforeUnmount","canAddFilter","showAddFilter","canResetToDefaults","isJsonEqual","_b","resetToDefaults","items","_unref","_createBlock","_Teleport","_createVNode","PlBtnGhost","_cache","PlSlideModal","$event","_createElementVNode","$style","PlElementList","item","_withCtx","_createTextVNode","_toDisplayString","index","PlTableFilterEntryV2","_createElementBlock","PlMaskIcon16","PlBtnSecondary","_openBlock","PlTableAddFilterV2","idx","filter"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValueOrErrorsComponent.vue.js","sources":["../../src/components/ValueOrErrorsComponent.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T\">\nimport { computed } from 'vue';\nimport type { ValueOrErrors } from '@platforma-sdk/model';\n\nconst props = defineProps<{\n valueOrError: ValueOrErrors<T> | undefined;\n}>();\n\nconst value = computed(() => (props.valueOrError && props.valueOrError.ok ? props.valueOrError.value : undefined));\n\nconst error = computed(() => (props.valueOrError && !props.valueOrError.ok ? props.valueOrError.errors : undefined));\n\nconst isUnresolved = computed(() => value.value === undefined && error.value === undefined);\n\ndefineSlots<{\n default(props: { value: T }): void;\n}>();\n</script>\n\n<template>\n <div>\n <slot v-if=\"value !== undefined\" name=\"default\" v-bind=\"{ value }\" />\n <div v-if=\"error\" class=\"alert-error\">\n {{ error }}\n </div>\n <div v-if=\"isUnresolved\">Unresolved</div>\n </div>\n</template>\n"],"names":["props","__props","value","computed","error","isUnresolved"],"mappings":";;;;;;;;;;AAIA,UAAMA,IAAQC,GAIRC,IAAQC,EAAS,MAAOH,EAAM,gBAAgBA,EAAM,aAAa,KAAKA,EAAM,aAAa,QAAQ,MAAU,GAE3GI,IAAQD,EAAS,MAAOH,EAAM,gBAAgB,CAACA,EAAM,aAAa,KAAKA,EAAM,aAAa,SAAS,MAAU,GAE7GK,IAAeF,EAAS,MAAMD,EAAM,UAAU,UAAaE,EAAM,UAAU,MAAS
|
|
1
|
+
{"version":3,"file":"ValueOrErrorsComponent.vue.js","sources":["../../src/components/ValueOrErrorsComponent.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T\">\nimport { computed } from 'vue';\nimport type { ValueOrErrors } from '@platforma-sdk/model';\n\nconst props = defineProps<{\n valueOrError: ValueOrErrors<T> | undefined;\n}>();\n\nconst value = computed(() => (props.valueOrError && props.valueOrError.ok ? props.valueOrError.value : undefined));\n\nconst error = computed(() => (props.valueOrError && !props.valueOrError.ok ? props.valueOrError.errors : undefined));\n\nconst isUnresolved = computed(() => value.value === undefined && error.value === undefined);\n\ndefineSlots<{\n default(props: { value: T }): void;\n}>();\n</script>\n\n<template>\n <div>\n <slot v-if=\"value !== undefined\" name=\"default\" v-bind=\"{ value }\" />\n <div v-if=\"error\" class=\"alert-error\">\n {{ error }}\n </div>\n <div v-if=\"isUnresolved\">Unresolved</div>\n </div>\n</template>\n"],"names":["props","__props","value","computed","error","isUnresolved","_createElementBlock","_renderSlot","_ctx","_hoisted_1","_toDisplayString","_openBlock"],"mappings":";;;;;;;;;;AAIA,UAAMA,IAAQC,GAIRC,IAAQC,EAAS,MAAOH,EAAM,gBAAgBA,EAAM,aAAa,KAAKA,EAAM,aAAa,QAAQ,MAAU,GAE3GI,IAAQD,EAAS,MAAOH,EAAM,gBAAgB,CAACA,EAAM,aAAa,KAAKA,EAAM,aAAa,SAAS,MAAU,GAE7GK,IAAeF,EAAS,MAAMD,EAAM,UAAU,UAAaE,EAAM,UAAU,MAAS;2BAQxFE,EAMM,OAAA,MAAA;AAAA,MALQJ,EAAA,UAAU,SAAtBK,EAAqEC,8CAAXN,EAAA,MAAA,CAAK,CAAA,CAAA;MACpDE,EAAA,cAAXE,EAEM,OAFNG,GAEMC,EADDN,EAAA,KAAK,GAAA,CAAA;MAECC,EAAA,SAAXM,EAAA,GAAAL,EAAyC,UAAhB,YAAU;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -5,16 +5,16 @@
|
|
|
5
5
|
.pl-ag-chart-stacked-bar-cell{height:100%;display:flex;flex-direction:row;align-items:center}.pl-ag-chart-stacked-bar-cell__not-ready{color:var(--txt-03)!important}`)),document.head.appendChild(r)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})();
|
|
6
6
|
|
|
7
7
|
import { default as m } from "./components/BlockLayout.vue.js";
|
|
8
|
-
import { default as p, default as
|
|
8
|
+
import { default as p, default as d } from "./components/PlAgDataTable/PlAgDataTableV2.vue.js";
|
|
9
9
|
import { default as i } from "./components/PlAgDataTable/PlAgOverlayLoading.vue.js";
|
|
10
|
-
import { default as
|
|
10
|
+
import { default as n } from "./components/PlAgDataTable/PlAgOverlayNoRows.vue.js";
|
|
11
11
|
|
|
12
12
|
import { default as A } from "./components/ValueOrErrorsComponent.vue.js";
|
|
13
13
|
import { useAgGridOptions as C } from "./AgGridVue/useAgGridOptions.js";
|
|
14
14
|
import { createAgGridColDef as b } from "./AgGridVue/createAgGridColDef.js";
|
|
15
|
-
import { deselectAll as w, getSelectedRowsCount as R, getTotalRowsCount as
|
|
15
|
+
import { deselectAll as w, getSelectedRowsCount as R, getTotalRowsCount as T, isSelectionEnabled as v, selectAll as D } from "./AgGridVue/selection.js";
|
|
16
16
|
import { default as V } from "./components/PlAgColumnHeader/PlAgColumnHeader.vue.js";
|
|
17
|
-
import { default as
|
|
17
|
+
import { default as M } from "./components/PlAgCellFile/PlAgCellFile.vue.js";
|
|
18
18
|
import { default as G } from "./components/PlAgCellProgress/PlAgCellProgress.vue.js";
|
|
19
19
|
import { default as k } from "./components/PlAgCellStatusTag/PlAgCellStatusTag.vue.js";
|
|
20
20
|
|
|
@@ -23,34 +23,33 @@ import { default as B } from "./components/PlAgChartHistogramCell/PlAgChartHisto
|
|
|
23
23
|
import { default as H } from "./components/PlAgChartStackedBarCell/PlAgChartStackedBarCell.vue.js";
|
|
24
24
|
|
|
25
25
|
import { usePlDataTableSettingsV2 as L } from "./components/PlAgDataTable/types.js";
|
|
26
|
-
import { PlAgDataTableRowNumberColId as j, autoSizeRowNumberColumn as
|
|
26
|
+
import { PlAgDataTableRowNumberColId as j, autoSizeRowNumberColumn as z, makeRowNumberColDef as U } from "./components/PlAgDataTable/sources/row-number.js";
|
|
27
27
|
import { DeferredCircular as J, ensureNodeVisible as K } from "./components/PlAgDataTable/sources/focus-row.js";
|
|
28
28
|
import { defaultMainMenuItems as W } from "./components/PlAgDataTable/sources/menu-items.js";
|
|
29
29
|
import { default as Y } from "./components/PlAgCsvExporter/PlAgCsvExporter.vue.js";
|
|
30
30
|
import { default as $ } from "./components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue.js";
|
|
31
31
|
import { default as re } from "./components/PlAgGridColumnManager/PlAgGridColumnManager.vue.js";
|
|
32
32
|
import { default as te } from "./components/PlTableFilters/PlTableFiltersV2.vue.js";
|
|
33
|
-
import { default as ae } from "./components/
|
|
34
|
-
import { default as me } from "./components/PlAnnotations/components/
|
|
35
|
-
import { default as pe } from "./components/
|
|
36
|
-
import { default as
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import { ReactiveFileContent as Le } from "./composition/fileContent.js";
|
|
33
|
+
import { default as ae } from "./components/PlAnnotations/components/PlAnnotations.vue.js";
|
|
34
|
+
import { default as me } from "./components/PlAnnotations/components/PlAnnotationsModal.vue.js";
|
|
35
|
+
import { default as pe } from "./components/PlBtnExportArchive/PlBtnExportArchive.vue.js";
|
|
36
|
+
import { default as ue } from "./components/PlAdvancedFilter/PlAdvancedFilter.vue.js";
|
|
37
|
+
import { defineApp as xe, useSdkPlugin as ne } from "./defineApp.js";
|
|
38
|
+
import { createModel as Ae } from "./createModel.js";
|
|
39
|
+
import { defineStore as Ce } from "./defineStore.js";
|
|
40
|
+
import { AgGridTheme as be, activateAgGrid as Ee } from "./aggrid.js";
|
|
41
|
+
import { MultiError as Re, UnresolvedError as Te, ensureError as ve, formatZodError as De, identity as Se, isDefined as Ve, isZodError as Oe, unwrapValueOrErrors as Me, wrapOptionalResult as he, wrapValueOrErrors as Ge } from "./utils.js";
|
|
42
|
+
import { objectHash as ke } from "./objectHash.js";
|
|
43
|
+
import { computedResult as Be } from "./computedResult.js";
|
|
44
|
+
import { ReactiveFileContent as He } from "./composition/fileContent.js";
|
|
46
45
|
export * from "@milaboratories/uikit";
|
|
47
46
|
export {
|
|
48
|
-
|
|
47
|
+
be as AgGridTheme,
|
|
49
48
|
m as BlockLayout,
|
|
50
49
|
J as DeferredCircular,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
Re as MultiError,
|
|
51
|
+
ue as PlAdvancedFilter,
|
|
52
|
+
M as PlAgCellFile,
|
|
54
53
|
G as PlAgCellProgress,
|
|
55
54
|
k as PlAgCellStatusTag,
|
|
56
55
|
B as PlAgChartHistogramCell,
|
|
@@ -61,43 +60,42 @@ export {
|
|
|
61
60
|
p as PlAgDataTableV2,
|
|
62
61
|
re as PlAgGridColumnManager,
|
|
63
62
|
i as PlAgOverlayLoading,
|
|
64
|
-
|
|
63
|
+
n as PlAgOverlayNoRows,
|
|
65
64
|
$ as PlAgTextAndButtonCell,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
ae as PlMultiSequenceAlignment,
|
|
65
|
+
ae as PlAnnotations,
|
|
66
|
+
me as PlAnnotationsModal,
|
|
67
|
+
pe as PlBtnExportArchive,
|
|
68
|
+
d as PlDataTableV2,
|
|
71
69
|
te as PlTableFiltersV2,
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
He as ReactiveFileContent,
|
|
71
|
+
Te as UnresolvedError,
|
|
74
72
|
A as ValueOrErrorsComponent,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
Ee as activateAgGrid,
|
|
74
|
+
z as autoSizeRowNumberColumn,
|
|
75
|
+
Be as computedResult,
|
|
78
76
|
b as createAgGridColDef,
|
|
79
|
-
|
|
77
|
+
Ae as createModel,
|
|
80
78
|
W as defaultMainMenuItems,
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
xe as defineApp,
|
|
80
|
+
Ce as defineStore,
|
|
83
81
|
w as deselectAll,
|
|
84
|
-
|
|
82
|
+
ve as ensureError,
|
|
85
83
|
K as ensureNodeVisible,
|
|
86
|
-
|
|
84
|
+
De as formatZodError,
|
|
87
85
|
R as getSelectedRowsCount,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
86
|
+
T as getTotalRowsCount,
|
|
87
|
+
Se as identity,
|
|
88
|
+
Ve as isDefined,
|
|
89
|
+
v as isSelectionEnabled,
|
|
90
|
+
Oe as isZodError,
|
|
91
|
+
U as makeRowNumberColDef,
|
|
92
|
+
ke as objectHash,
|
|
93
|
+
D as selectAll,
|
|
94
|
+
Me as unwrapValueOrErrors,
|
|
97
95
|
C as useAgGridOptions,
|
|
98
96
|
L as usePlDataTableSettingsV2,
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
97
|
+
ne as useSdkPlugin,
|
|
98
|
+
he as wrapOptionalResult,
|
|
99
|
+
Ge as wrapValueOrErrors
|
|
102
100
|
};
|
|
103
101
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -16,7 +16,6 @@ export * from './components/PlAgCsvExporter';
|
|
|
16
16
|
export * from './components/PlAgTextAndButtonCell';
|
|
17
17
|
export * from './components/PlAgGridColumnManager';
|
|
18
18
|
export * from './components/PlTableFilters';
|
|
19
|
-
export * from './components/PlMultiSequenceAlignment';
|
|
20
19
|
export * from './components/PlAnnotations';
|
|
21
20
|
export * from './components/PlBtnExportArchive';
|
|
22
21
|
export * from './components/PlAdvancedFilter';
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
const u = /* @__PURE__ */
|
|
1
|
+
import { defineComponent as l, createElementBlock as d, openBlock as p, normalizeClass as c, createElementVNode as n, toDisplayString as f } from "vue";
|
|
2
|
+
const u = /* @__PURE__ */ l({
|
|
3
3
|
__name: "EndOfPeriod",
|
|
4
4
|
props: {
|
|
5
5
|
endOfPeriod: {}
|
|
6
6
|
},
|
|
7
|
-
setup(
|
|
8
|
-
const
|
|
7
|
+
setup(o) {
|
|
8
|
+
const r = (e) => {
|
|
9
9
|
if (!e) return "N/A";
|
|
10
|
-
const t = new Date(e),
|
|
11
|
-
return `${
|
|
10
|
+
const t = new Date(e), a = t.getDate().toString().padStart(2, "0"), s = (t.getMonth() + 1).toString().padStart(2, "0"), i = t.getFullYear();
|
|
11
|
+
return `${a}.${s}.${i}`;
|
|
12
12
|
};
|
|
13
|
-
return (e, t) => (
|
|
14
|
-
class:
|
|
13
|
+
return (e, t) => (p(), d("div", {
|
|
14
|
+
class: c(e.$style.container)
|
|
15
15
|
}, [
|
|
16
16
|
t[0] || (t[0] = n("span", null, "End of period", -1)),
|
|
17
|
-
n("span", null,
|
|
17
|
+
n("span", null, f(r(o.endOfPeriod)), 1)
|
|
18
18
|
], 2));
|
|
19
19
|
}
|
|
20
20
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EndOfPeriod.vue2.js","sources":["../../../src/plugins/Monetization/EndOfPeriod.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{\n endOfPeriod: string | null;\n}>();\n\nconst formateStringDate = (date: string | null) => {\n if (!date) return 'N/A';\n const dateObj = new Date(date);\n const day = dateObj.getDate().toString().padStart(2, '0');\n const month = (dateObj.getMonth() + 1).toString().padStart(2, '0'); // Month is 0-indexed\n const year = dateObj.getFullYear();\n return `${day}.${month}.${year}`;\n};\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <span>End of period</span>\n <span>{{ formateStringDate(endOfPeriod) }}</span>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n background-color: #F7F8FA;\n border-radius: 6px;\n min-height: 40px;\n padding: 0 12px 0 12px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 500;\n border: 1px solid var(--border-color-div-grey);\n span:first-child {\n overflow: hidden;\n font-weight: 600;\n }\n}\n</style>\n"],"names":["formateStringDate","date","dateObj","day","month","year"],"mappings":";;;;;;;AAKA,UAAMA,IAAoB,CAACC,MAAwB;AACjD,UAAI,CAACA,EAAM,QAAO;AAClB,YAAMC,IAAU,IAAI,KAAKD,CAAI,GACvBE,IAAMD,EAAQ,QAAA,EAAU,WAAW,SAAS,GAAG,GAAG,GAClDE,KAASF,EAAQ,SAAA,IAAa,GAAG,WAAW,SAAS,GAAG,GAAG,GAC3DG,IAAOH,EAAQ,YAAA;AACrB,aAAO,GAAGC,CAAG,IAAIC,CAAK,IAAIC,CAAI;AAAA,IAChC
|
|
1
|
+
{"version":3,"file":"EndOfPeriod.vue2.js","sources":["../../../src/plugins/Monetization/EndOfPeriod.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{\n endOfPeriod: string | null;\n}>();\n\nconst formateStringDate = (date: string | null) => {\n if (!date) return 'N/A';\n const dateObj = new Date(date);\n const day = dateObj.getDate().toString().padStart(2, '0');\n const month = (dateObj.getMonth() + 1).toString().padStart(2, '0'); // Month is 0-indexed\n const year = dateObj.getFullYear();\n return `${day}.${month}.${year}`;\n};\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <span>End of period</span>\n <span>{{ formateStringDate(endOfPeriod) }}</span>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n background-color: #F7F8FA;\n border-radius: 6px;\n min-height: 40px;\n padding: 0 12px 0 12px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 500;\n border: 1px solid var(--border-color-div-grey);\n span:first-child {\n overflow: hidden;\n font-weight: 600;\n }\n}\n</style>\n"],"names":["formateStringDate","date","dateObj","day","month","year","_createElementBlock","_normalizeClass","$style","_cache","_createElementVNode","_toDisplayString","__props"],"mappings":";;;;;;;AAKA,UAAMA,IAAoB,CAACC,MAAwB;AACjD,UAAI,CAACA,EAAM,QAAO;AAClB,YAAMC,IAAU,IAAI,KAAKD,CAAI,GACvBE,IAAMD,EAAQ,QAAA,EAAU,WAAW,SAAS,GAAG,GAAG,GAClDE,KAASF,EAAQ,SAAA,IAAa,GAAG,WAAW,SAAS,GAAG,GAAG,GAC3DG,IAAOH,EAAQ,YAAA;AACrB,aAAO,GAAGC,CAAG,IAAIC,CAAK,IAAIC,CAAI;AAAA,IAChC;2BAIEC,EAGM,OAAA;AAAA,MAHA,OAAKC,EAAEC,EAAAA,OAAO,SAAS;AAAA,IAAA;MAC3BC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAA0B,cAApB,iBAAa,EAAA;AAAA,MACnBA,EAAiD,QAAA,MAAAC,EAAxCX,EAAkBY,EAAA,WAAW,CAAA,GAAA,CAAA;AAAA,IAAA;;;"}
|