@morscherlab/mint-sdk 1.2.0-beta.7 → 1.2.0-beta.9
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 +30 -0
- package/dist/{ExperimentPopover-CfOdh5Rm.js → ExperimentPopover-oL0fg_A0.js} +5 -3
- package/dist/ExperimentPopover-oL0fg_A0.js.map +1 -0
- package/dist/{ExperimentSelectorModal-DvIagrxY.js → ExperimentSelectorModal-BeEOomw_.js} +4 -4
- package/dist/ExperimentSelectorModal-BeEOomw_.js.map +1 -0
- package/dist/{SettingsModal-W3TYfnP9.js → SettingsModal-Dphh3RrI.js} +4 -4
- package/dist/SettingsModal-Dphh3RrI.js.map +1 -0
- package/dist/{EmptyState-NBqf2_8z.js → Skeleton-DxtwJ5gt.js} +110 -92
- package/dist/Skeleton-DxtwJ5gt.js.map +1 -0
- package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
- package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
- package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
- package/dist/components/ActionMenu.vue.d.ts +1 -1
- package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
- package/dist/components/AuditTrail.vue.d.ts +13 -0
- package/dist/components/BatchProgressList.vue.d.ts +17 -0
- package/dist/components/DataFrame.vue.d.ts +14 -2
- package/dist/components/DatePicker.vue.d.ts +1 -1
- package/dist/components/DateTimePicker.vue.d.ts +2 -0
- package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
- package/dist/components/ExperimentPopover.vue.d.ts +1 -0
- package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
- package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
- package/dist/components/ProgressBar.vue.d.ts +1 -1
- package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
- package/dist/components/ReagentList.vue.d.ts +29 -1
- package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
- package/dist/components/SampleSelector.drag.d.ts +13 -0
- package/dist/components/SampleSelector.tree.d.ts +2 -0
- package/dist/components/SampleSelector.vue.d.ts +34 -1
- package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -0
- package/dist/components/TimePicker.vue.d.ts +1 -0
- package/dist/components/WellPlate.geometry.d.ts +15 -0
- package/dist/components/WellPlate.interaction.d.ts +13 -0
- package/dist/components/WellPlate.vue.d.ts +29 -0
- package/dist/components/index.js +6 -6
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
- package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
- package/dist/{components-B80gV0P6.js → components-CgAUzF8F.js} +1930 -1688
- package/dist/components-CgAUzF8F.js.map +1 -0
- package/dist/composables/controlSchemaTypes.d.ts +34 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/index.js +9 -9
- package/dist/composables/useDropdownState.d.ts +18 -2
- package/dist/composables/useEventStream.d.ts +9 -0
- package/dist/composables/useListReorder.d.ts +90 -0
- package/dist/composables/useMenuKeyboard.d.ts +2 -2
- package/dist/composables/usePluginConfig.d.ts +3 -1
- package/dist/composables/useRequestSyncState.d.ts +42 -2
- package/dist/composables/useScheduleDrag.d.ts +1 -0
- package/dist/{composables-C8mmD5ta.js → composables-B_pia3hO.js} +13 -69
- package/dist/composables-B_pia3hO.js.map +1 -0
- package/dist/{useApi-CDBq6z23.js → errors-_W0-LbA6.js} +102 -3
- package/dist/errors-_W0-LbA6.js.map +1 -0
- package/dist/{experiment-Y9Iz7KYi.js → experiment-Cwl9AYxw.js} +3 -8
- package/dist/experiment-Cwl9AYxw.js.map +1 -0
- package/dist/experiment-utils-DV3DrvE_.js.map +1 -1
- package/dist/index.js +14 -14
- package/dist/install.js +2 -7
- package/dist/install.js.map +1 -1
- package/dist/permissions.d.ts +42 -1
- package/dist/permissions.js +20 -10
- package/dist/permissions.js.map +1 -1
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +3 -3
- package/dist/stores/settings.d.ts +31 -1
- package/dist/styles.css +9572 -27877
- package/dist/templates/index.js +2 -4
- package/dist/{templates-CK72aKO1.js → templates-Qq113pyZ.js} +291 -85
- package/dist/templates-Qq113pyZ.js.map +1 -0
- package/dist/{useControlSchema-_OVhavKq.js → useControlSchema-aMZlb4Sc.js} +197 -1089
- package/dist/useControlSchema-aMZlb4Sc.js.map +1 -0
- package/dist/{useDropdownState-D5G4UvWd.js → useDropdownState-DitCtrTT.js} +21 -5
- package/dist/useDropdownState-DitCtrTT.js.map +1 -0
- package/dist/{useExperimentSelector-DSEckf_g.js → useExperimentSelector-I8HC8hUu.js} +3 -3
- package/dist/{useExperimentSelector-DSEckf_g.js.map → useExperimentSelector-I8HC8hUu.js.map} +1 -1
- package/dist/{useFormBuilder-Bd714C7y.js → useFormBuilder-TCxNnqeb.js} +2 -2
- package/dist/{useFormBuilder-Bd714C7y.js.map → useFormBuilder-TCxNnqeb.js.map} +1 -1
- package/dist/{useProtocolTemplates-Dq5Pzwyd.js → useProtocolTemplates-BmX_iVBR.js} +185 -157
- package/dist/useProtocolTemplates-BmX_iVBR.js.map +1 -0
- package/dist/utils/color.d.ts +13 -0
- package/dist/utils/errors.d.ts +9 -0
- package/package.json +1 -1
- package/src/__tests__/components/ActionMenu.test.ts +94 -0
- package/src/__tests__/components/DataFrame.test.ts +183 -11
- package/src/__tests__/components/DataStates.test.ts +176 -0
- package/src/__tests__/components/DatePicker.test.ts +76 -0
- package/src/__tests__/components/DateTimePicker.test.ts +36 -0
- package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
- package/src/__tests__/components/GroupAssigner.test.ts +53 -0
- package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
- package/src/__tests__/components/RackEditor.test.ts +35 -0
- package/src/__tests__/components/ReagentList.test.ts +64 -2
- package/src/__tests__/components/RetiredStyles.test.ts +31 -0
- package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
- package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
- package/src/__tests__/components/SegmentedControl.test.ts +88 -0
- package/src/__tests__/components/TimePicker.test.ts +61 -0
- package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
- package/src/__tests__/composables/useDropdownState.test.ts +58 -1
- package/src/__tests__/composables/useListReorder.test.ts +145 -0
- package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
- package/src/__tests__/stores/settings.test.ts +71 -1
- package/src/__tests__/styles/cssTokens.test.ts +131 -0
- package/src/__tests__/utils/permissions.test.ts +68 -0
- package/src/components/ActionMenu.vue +45 -88
- package/src/components/AlertBox.vue +0 -4
- package/src/components/AppAvatarMenu.vue +2 -14
- package/src/components/AppLayout.vue +0 -4
- package/src/components/AppPluginSwitcher.story.vue +87 -0
- package/src/components/AppPluginSwitcher.vue +2 -5
- package/src/components/AppSidebar.vue +0 -4
- package/src/components/AppToastContainer.vue +6 -8
- package/src/components/AppTopBar.vue +0 -4
- package/src/components/ArtifactSaveDialog.vue +0 -4
- package/src/components/ArtifactSelectorModal.vue +0 -4
- package/src/components/AuditTrail.story.vue +18 -0
- package/src/components/AuditTrail.vue +27 -7
- package/src/components/AutoGroupModal.vue +0 -4
- package/src/components/Avatar.vue +0 -4
- package/src/components/BaseButton.vue +0 -4
- package/src/components/BaseCheckbox.vue +0 -4
- package/src/components/BaseInput.vue +0 -4
- package/src/components/BaseModal.vue +0 -4
- package/src/components/BasePill.vue +0 -4
- package/src/components/BaseRadioGroup.vue +0 -4
- package/src/components/BaseSelect.vue +0 -4
- package/src/components/BaseSlider.vue +0 -4
- package/src/components/BaseTabs.vue +0 -4
- package/src/components/BaseTextarea.vue +0 -4
- package/src/components/BaseToggle.vue +0 -4
- package/src/components/BatchProgressList.story.vue +18 -0
- package/src/components/BatchProgressList.vue +32 -4
- package/src/components/Breadcrumb.vue +0 -4
- package/src/components/Calendar.vue +0 -4
- package/src/components/ChartContainer.story.vue +1 -1
- package/src/components/ChartContainer.vue +0 -4
- package/src/components/ChemicalFormula.vue +0 -4
- package/src/components/CollapsibleCard.vue +0 -4
- package/src/components/ColorSlider.vue +0 -4
- package/src/components/ConcentrationInput.vue +0 -4
- package/src/components/ConfirmDialog.vue +0 -4
- package/src/components/DataFrame.story.vue +14 -0
- package/src/components/DataFrame.vue +97 -23
- package/src/components/DatePicker.vue +73 -27
- package/src/components/DateTimePicker.vue +45 -17
- package/src/components/Divider.vue +0 -4
- package/src/components/DoseCalculator.vue +0 -4
- package/src/components/DropdownButton.vue +2 -14
- package/src/components/EmptyState.vue +0 -4
- package/src/components/ExperimentCodeBadge.vue +0 -4
- package/src/components/ExperimentDataViewer.story.vue +3 -0
- package/src/components/ExperimentDataViewer.vue +33 -13
- package/src/components/ExperimentPopover.vue +2 -5
- package/src/components/ExperimentSelectorModal.vue +0 -4
- package/src/components/ExperimentTimeline.story.vue +18 -0
- package/src/components/ExperimentTimeline.vue +81 -75
- package/src/components/FileUploader.vue +0 -4
- package/src/components/FitPanel.vue +0 -4
- package/src/components/FormActions.story.vue +96 -0
- package/src/components/FormActions.vue +0 -4
- package/src/components/FormBuilder.vue +0 -4
- package/src/components/FormField.vue +0 -4
- package/src/components/FormulaInput.vue +0 -4
- package/src/components/GeneratedPathInput.story.vue +68 -0
- package/src/components/GeneratedPlotlyResult.story.vue +96 -0
- package/src/components/GeneratedPlotlyResult.vue +3 -3
- package/src/components/GeneratedPluginView.story.vue +145 -0
- package/src/components/GeneratedPluginView.vue +10 -10
- package/src/components/GeneratedResultRenderer.story.vue +117 -0
- package/src/components/GeneratedResultRenderer.vue +4 -4
- package/src/components/GroupAssigner.vue +67 -5
- package/src/components/IconButton.vue +0 -4
- package/src/components/InstrumentAlertLog.vue +0 -4
- package/src/components/InstrumentStateBadge.vue +0 -4
- package/src/components/InstrumentStatusCard.vue +0 -4
- package/src/components/JobsStatusTray.vue +0 -4
- package/src/components/LcmsSequenceTable.vue +81 -50
- package/src/components/LoadingSpinner.vue +0 -4
- package/src/components/MobileSupportGate.vue +0 -4
- package/src/components/MoleculeInput.vue +0 -4
- package/src/components/MultiSelect.vue +0 -4
- package/src/components/NumberInput.vue +0 -4
- package/src/components/PlateMapEditor.vue +3 -14
- package/src/components/PluginIcon.vue +0 -4
- package/src/components/ProgressBar.vue +0 -4
- package/src/components/ProtocolStepEditor.vue +2 -4
- package/src/components/RackEditor.vue +51 -70
- package/src/components/ReagentEditor.vue +0 -4
- package/src/components/ReagentList.story.vue +18 -0
- package/src/components/ReagentList.vue +127 -82
- package/src/components/ResourceCard.vue +0 -4
- package/src/components/RuntimeUpdateNotice.story.vue +49 -0
- package/src/components/RuntimeUpdateNotice.vue +4 -4
- package/src/components/SampleHierarchyTree.story.vue +18 -0
- package/src/components/SampleHierarchyTree.vue +32 -9
- package/src/components/SampleLegend.vue +2 -8
- package/src/components/SampleSelector.drag.ts +51 -0
- package/src/components/SampleSelector.story.vue +6 -0
- package/src/components/SampleSelector.tree.ts +2 -0
- package/src/components/SampleSelector.vue +49 -10
- package/src/components/SampleSelectorGroupNode.vue +19 -0
- package/src/components/ScheduleCalendar.story.vue +6 -0
- package/src/components/ScheduleCalendar.vue +82 -7
- package/src/components/ScientificNumber.vue +0 -4
- package/src/components/SectionCard.vue +0 -4
- package/src/components/SegmentedControl.vue +48 -5
- package/src/components/SequenceInput.vue +0 -4
- package/src/components/SequenceProgressBar.story.vue +110 -0
- package/src/components/SequenceProgressBar.vue +0 -4
- package/src/components/SettingsModal.vue +0 -4
- package/src/components/Skeleton.vue +0 -4
- package/src/components/SmartGroupFieldRecipe.vue +8 -6
- package/src/components/SmartGroupManual.vue +0 -4
- package/src/components/StatusIndicator.vue +0 -4
- package/src/components/StepWizard.vue +0 -4
- package/src/components/TagsInput.vue +4 -6
- package/src/components/ThemeToggle.vue +0 -4
- package/src/components/TimePicker.vue +36 -7
- package/src/components/TimeRangeInput.vue +0 -4
- package/src/components/Tooltip.story.vue +3 -3
- package/src/components/Tooltip.vue +0 -4
- package/src/components/UnitInput.vue +0 -4
- package/src/components/WellPlate.geometry.ts +60 -1
- package/src/components/WellPlate.interaction.ts +44 -0
- package/src/components/WellPlate.story.vue +8 -0
- package/src/components/WellPlate.vue +53 -7
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
- package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
- package/src/components/internal/DataStateInternal.vue +74 -0
- package/src/components/internal/FormSectionRenderer.vue +0 -4
- package/src/components/internal/WellEditPopupInternal.vue +0 -4
- package/src/composables/controlSchemaTypes.ts +34 -0
- package/src/composables/index.ts +10 -0
- package/src/composables/useDropdownState.ts +35 -5
- package/src/composables/useEventStream.ts +14 -2
- package/src/composables/useFileImport.ts +2 -7
- package/src/composables/useGeneratedAnalysis.ts +8 -9
- package/src/composables/useListReorder.story.vue +143 -0
- package/src/composables/useListReorder.ts +242 -0
- package/src/composables/useMenuKeyboard.ts +2 -2
- package/src/composables/useOptimisticMutation.ts +1 -15
- package/src/composables/usePluginConfig.ts +3 -1
- package/src/composables/useRackEditor.ts +2 -11
- package/src/composables/useRequestSyncState.ts +98 -28
- package/src/composables/useResourceCrud.ts +1 -15
- package/src/composables/useScheduleDrag.ts +37 -0
- package/src/composables/useWellPainting.ts +5 -29
- package/src/composables/useWellPlateEditor.ts +1 -11
- package/src/permissions.ts +48 -9
- package/src/stores/experiment.ts +2 -7
- package/src/stores/index.ts +9 -1
- package/src/stores/settings.ts +93 -1
- package/src/styles/components/audit-trail.css +5 -5
- package/src/styles/components/batch-progress-list.css +7 -0
- package/src/styles/components/color-slider.css +2 -2
- package/src/styles/components/data-state.css +30 -0
- package/src/styles/components/dataframe.css +29 -35
- package/src/styles/components/experiment-data-viewer.css +4 -4
- package/src/styles/components/experiment-timeline.css +3 -30
- package/src/styles/components/form-builder.css +5 -5
- package/src/styles/components/lcms-sequence-table.css +16 -1
- package/src/styles/components/multi-select.css +1 -1
- package/src/styles/components/reagent-list.css +38 -31
- package/src/styles/components/sample-hierarchy-tree.css +5 -19
- package/src/styles/components/sample-selector.css +9 -2
- package/src/styles/components/schedule-calendar.css +8 -0
- package/src/styles/components/scientific-number.css +1 -1
- package/src/styles/components/well-plate.css +8 -0
- package/src/styles/index.css +8 -0
- package/src/styles/variables.css +29 -0
- package/src/templates/builderPresetControls.ts +1 -1
- package/src/templates/componentPlateHelpers.ts +3 -1
- package/src/templates/doseResponseAdapters.ts +2 -13
- package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
- package/src/templates/plateMapBuilder.ts +2 -2
- package/src/templates/qpcrPlateBuilder.ts +1 -1
- package/src/templates/templateValidators.ts +1 -1
- package/src/templates/timeCourseBuilder.ts +2 -2
- package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
- package/src/utils/color.ts +51 -0
- package/src/utils/errors.ts +29 -0
- package/dist/EmptyState-NBqf2_8z.js.map +0 -1
- package/dist/ExperimentPopover-CfOdh5Rm.js.map +0 -1
- package/dist/ExperimentSelectorModal-DvIagrxY.js.map +0 -1
- package/dist/SettingsModal-W3TYfnP9.js.map +0 -1
- package/dist/components-B80gV0P6.js.map +0 -1
- package/dist/composables/autoGroupConstants.d.ts +0 -1
- package/dist/composables/autoGroupGrouping.d.ts +0 -3
- package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
- package/dist/composables-C8mmD5ta.js.map +0 -1
- package/dist/experiment-Y9Iz7KYi.js.map +0 -1
- package/dist/templates/builderDefaults.d.ts +0 -1
- package/dist/templates/plateGeometry.d.ts +0 -4
- package/dist/templates-CK72aKO1.js.map +0 -1
- package/dist/useApi-CDBq6z23.js.map +0 -1
- package/dist/useControlSchema-_OVhavKq.js.map +0 -1
- package/dist/useDropdownState-D5G4UvWd.js.map +0 -1
- package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +0 -1
- package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
- package/src/composables/autoGroupConstants.ts +0 -4
- package/src/composables/autoGroupGrouping.ts +0 -148
- package/src/composables/useAutoGroupInputSources.ts +0 -147
- package/src/templates/builderDefaults.ts +0 -11
- package/src/templates/plateGeometry.ts +0 -62
- /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → components/DataStates.test.d.ts} +0 -0
package/dist/permissions.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const ADMIN_ROLE = "admin";
|
|
2
|
-
export declare const ADMIN_PANEL_PERMISSIONS: readonly ["users.view", "users.
|
|
2
|
+
export declare const ADMIN_PANEL_PERMISSIONS: readonly ["users.view", "users.manage", "platform.configure", "platform.view_logs", "plugins.configure", "plugins.install", "notices.publish"];
|
|
3
3
|
export type AccessAudience = 'all' | 'admin' | 'user';
|
|
4
4
|
export type AccessAudienceInput = AccessAudience | readonly AccessAudience[];
|
|
5
5
|
export interface RoleInfo {
|
|
@@ -26,11 +26,36 @@ export interface AccessPolicy {
|
|
|
26
26
|
anyPermissions?: readonly string[];
|
|
27
27
|
plugin?: string;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* An object that carries an access rule.
|
|
31
|
+
*
|
|
32
|
+
* The nested `access` policy is the supported shape. The four flat fields are
|
|
33
|
+
* the pre-1.2 spelling of the same four `AccessPolicy` fields; they still work
|
|
34
|
+
* but are deprecated, and `normalizeAccessPolicy()` lets the nested policy win
|
|
35
|
+
* wherever both are given.
|
|
36
|
+
*/
|
|
29
37
|
export interface AccessControlled {
|
|
38
|
+
/** The access policy. Preferred over the flat fields below. */
|
|
30
39
|
access?: AccessPolicy;
|
|
40
|
+
/**
|
|
41
|
+
* @deprecated Since MINT 1.2; use `access.visibleFor` instead. The flat
|
|
42
|
+
* duplicate is removed in 1.3.
|
|
43
|
+
*/
|
|
31
44
|
visibleFor?: AccessAudienceInput;
|
|
45
|
+
/**
|
|
46
|
+
* @deprecated Since MINT 1.2; use `access.requiresAdmin` instead. The flat
|
|
47
|
+
* duplicate is removed in 1.3.
|
|
48
|
+
*/
|
|
32
49
|
requiresAdmin?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* @deprecated Since MINT 1.2; use `access.permissions` instead. The flat
|
|
52
|
+
* duplicate is removed in 1.3.
|
|
53
|
+
*/
|
|
33
54
|
permissions?: readonly string[];
|
|
55
|
+
/**
|
|
56
|
+
* @deprecated Since MINT 1.2; use `access.anyPermissions` instead. The flat
|
|
57
|
+
* duplicate is removed in 1.3.
|
|
58
|
+
*/
|
|
34
59
|
anyPermissions?: readonly string[];
|
|
35
60
|
}
|
|
36
61
|
export declare function getRoleInfo(user: PermissionUser | null | undefined): RoleInfo | null;
|
|
@@ -42,5 +67,21 @@ export declare function hasAllPermissions(user: PermissionUser | null | undefine
|
|
|
42
67
|
export declare function hasAnyPermission(user: PermissionUser | null | undefined, permissions?: readonly string[]): boolean;
|
|
43
68
|
export declare function canAccessAdmin(user: PermissionUser | null | undefined): boolean;
|
|
44
69
|
export declare function canAccessPlugin(user: PermissionUser | null | undefined, pluginName: string | null | undefined): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Flatten an access rule — either shape, or a mix of both — into one policy.
|
|
72
|
+
*
|
|
73
|
+
* ## Precedence
|
|
74
|
+
*
|
|
75
|
+
* 1. A defined field on the nested `access` policy wins. It is the supported
|
|
76
|
+
* spelling, so an object that carries both shapes is read as "the nested
|
|
77
|
+
* policy, with the deprecated flat fields as leftovers".
|
|
78
|
+
* 2. Otherwise the flat field on the rule itself is used.
|
|
79
|
+
* 3. A field set to `undefined` on either side counts as unset and never
|
|
80
|
+
* masks the other side.
|
|
81
|
+
*
|
|
82
|
+
* Only `AccessPolicy` fields the flat shape never had (`audience`,
|
|
83
|
+
* `requiresAuth`, `plugin`) can come from the nested policy alone; the four
|
|
84
|
+
* duplicated fields are the ones this ordering exists for.
|
|
85
|
+
*/
|
|
45
86
|
export declare function normalizeAccessPolicy(rule: AccessControlled | AccessPolicy | undefined): AccessPolicy;
|
|
46
87
|
export declare function canAccessByPolicy(user: PermissionUser | null | undefined, rule: AccessControlled | AccessPolicy | undefined, isAuthenticated?: boolean): boolean;
|
package/dist/permissions.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
var ADMIN_ROLE = "admin";
|
|
3
3
|
var ADMIN_PANEL_PERMISSIONS = [
|
|
4
4
|
"users.view",
|
|
5
|
-
"users.invite",
|
|
6
5
|
"users.manage",
|
|
7
6
|
"platform.configure",
|
|
8
7
|
"platform.view_logs",
|
|
@@ -48,17 +47,28 @@ function canAccessPlugin(user, pluginName) {
|
|
|
48
47
|
if (!access || access === "all") return true;
|
|
49
48
|
return Array.isArray(access) && access.includes(pluginName);
|
|
50
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Flatten an access rule — either shape, or a mix of both — into one policy.
|
|
52
|
+
*
|
|
53
|
+
* ## Precedence
|
|
54
|
+
*
|
|
55
|
+
* 1. A defined field on the nested `access` policy wins. It is the supported
|
|
56
|
+
* spelling, so an object that carries both shapes is read as "the nested
|
|
57
|
+
* policy, with the deprecated flat fields as leftovers".
|
|
58
|
+
* 2. Otherwise the flat field on the rule itself is used.
|
|
59
|
+
* 3. A field set to `undefined` on either side counts as unset and never
|
|
60
|
+
* masks the other side.
|
|
61
|
+
*
|
|
62
|
+
* Only `AccessPolicy` fields the flat shape never had (`audience`,
|
|
63
|
+
* `requiresAuth`, `plugin`) can come from the nested policy alone; the four
|
|
64
|
+
* duplicated fields are the ones this ordering exists for.
|
|
65
|
+
*/
|
|
51
66
|
function normalizeAccessPolicy(rule) {
|
|
52
67
|
if (!rule) return {};
|
|
53
|
-
const { access: nested, ...
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
..."visibleFor" in rule && rule.visibleFor !== void 0 ? { visibleFor: rule.visibleFor } : {},
|
|
58
|
-
..."requiresAdmin" in rule && rule.requiresAdmin !== void 0 ? { requiresAdmin: rule.requiresAdmin } : {},
|
|
59
|
-
..."permissions" in rule && rule.permissions !== void 0 ? { permissions: rule.permissions } : {},
|
|
60
|
-
..."anyPermissions" in rule && rule.anyPermissions !== void 0 ? { anyPermissions: rule.anyPermissions } : {}
|
|
61
|
-
};
|
|
68
|
+
const { access: nested, ...flat } = rule;
|
|
69
|
+
const policy = { ...flat };
|
|
70
|
+
for (const [field, value] of Object.entries(nested ?? {})) if (value !== void 0) policy[field] = value;
|
|
71
|
+
return policy;
|
|
62
72
|
}
|
|
63
73
|
function canAccessByPolicy(user, rule, isAuthenticated = user !== null && user !== void 0) {
|
|
64
74
|
const policy = normalizeAccessPolicy(rule);
|
package/dist/permissions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","names":[],"sources":["../src/permissions.ts"],"sourcesContent":["export const ADMIN_ROLE = 'admin'\n\nexport const ADMIN_PANEL_PERMISSIONS = [\n 'users.view',\n 'users.
|
|
1
|
+
{"version":3,"file":"permissions.js","names":[],"sources":["../src/permissions.ts"],"sourcesContent":["export const ADMIN_ROLE = 'admin'\n\nexport const ADMIN_PANEL_PERMISSIONS = [\n 'users.view',\n 'users.manage',\n 'platform.configure',\n 'platform.view_logs',\n 'plugins.configure',\n 'plugins.install',\n 'notices.publish',\n] as const\n\nexport type AccessAudience = 'all' | 'admin' | 'user'\nexport type AccessAudienceInput = AccessAudience | readonly AccessAudience[]\n\nexport interface RoleInfo {\n id?: number\n slug: string\n name?: string\n color?: string\n permissions?: readonly string[] | null\n project_scope?: 'all' | 'assigned' | string\n plugin_access?: readonly string[] | 'all' | null\n}\n\nexport interface PermissionUser {\n role?: string | null\n role_obj?: RoleInfo | null\n roleObj?: RoleInfo | null\n permissions?: readonly string[] | null\n}\n\nexport interface AccessPolicy {\n audience?: AccessAudienceInput\n visibleFor?: AccessAudienceInput\n requiresAuth?: boolean\n requiresAdmin?: boolean\n permissions?: readonly string[]\n anyPermissions?: readonly string[]\n plugin?: string\n}\n\n/**\n * An object that carries an access rule.\n *\n * The nested `access` policy is the supported shape. The four flat fields are\n * the pre-1.2 spelling of the same four `AccessPolicy` fields; they still work\n * but are deprecated, and `normalizeAccessPolicy()` lets the nested policy win\n * wherever both are given.\n */\nexport interface AccessControlled {\n /** The access policy. Preferred over the flat fields below. */\n access?: AccessPolicy\n /**\n * @deprecated Since MINT 1.2; use `access.visibleFor` instead. The flat\n * duplicate is removed in 1.3.\n */\n visibleFor?: AccessAudienceInput\n /**\n * @deprecated Since MINT 1.2; use `access.requiresAdmin` instead. The flat\n * duplicate is removed in 1.3.\n */\n requiresAdmin?: boolean\n /**\n * @deprecated Since MINT 1.2; use `access.permissions` instead. The flat\n * duplicate is removed in 1.3.\n */\n permissions?: readonly string[]\n /**\n * @deprecated Since MINT 1.2; use `access.anyPermissions` instead. The flat\n * duplicate is removed in 1.3.\n */\n anyPermissions?: readonly string[]\n}\n\nexport function getRoleInfo(user: PermissionUser | null | undefined): RoleInfo | null {\n return user?.roleObj ?? user?.role_obj ?? null\n}\n\nexport function isAdminRole(role: string | null | undefined): boolean {\n return role === ADMIN_ROLE\n}\n\nexport function isAdminUser(user: PermissionUser | null | undefined): boolean {\n return isAdminRole(user?.role) || getRoleInfo(user)?.slug === ADMIN_ROLE\n}\n\nexport function getAccessAudience(user: PermissionUser | null | undefined): Exclude<AccessAudience, 'all'> {\n return isAdminUser(user) ? 'admin' : 'user'\n}\n\nexport function getUserPermissions(user: PermissionUser | null | undefined): string[] {\n const rolePermissions = getRoleInfo(user)?.permissions\n if (rolePermissions?.length) return [...rolePermissions]\n return [...(user?.permissions ?? [])]\n}\n\nexport function hasAllPermissions(\n user: PermissionUser | null | undefined,\n permissions: readonly string[] = [],\n): boolean {\n if (permissions.length === 0) return true\n if (isAdminUser(user)) return true\n const granted = new Set(getUserPermissions(user))\n return permissions.every(permission => granted.has(permission))\n}\n\nexport function hasAnyPermission(\n user: PermissionUser | null | undefined,\n permissions: readonly string[] = [],\n): boolean {\n if (permissions.length === 0) return true\n if (isAdminUser(user)) return true\n const granted = new Set(getUserPermissions(user))\n return permissions.some(permission => granted.has(permission))\n}\n\nexport function canAccessAdmin(user: PermissionUser | null | undefined): boolean {\n return isAdminUser(user) || hasAnyPermission(user, ADMIN_PANEL_PERMISSIONS)\n}\n\nexport function canAccessPlugin(\n user: PermissionUser | null | undefined,\n pluginName: string | null | undefined,\n): boolean {\n if (!pluginName) return true\n const access = getRoleInfo(user)?.plugin_access\n if (!access || access === 'all') return true\n return Array.isArray(access) && access.includes(pluginName)\n}\n\n/**\n * Flatten an access rule — either shape, or a mix of both — into one policy.\n *\n * ## Precedence\n *\n * 1. A defined field on the nested `access` policy wins. It is the supported\n * spelling, so an object that carries both shapes is read as \"the nested\n * policy, with the deprecated flat fields as leftovers\".\n * 2. Otherwise the flat field on the rule itself is used.\n * 3. A field set to `undefined` on either side counts as unset and never\n * masks the other side.\n *\n * Only `AccessPolicy` fields the flat shape never had (`audience`,\n * `requiresAuth`, `plugin`) can come from the nested policy alone; the four\n * duplicated fields are the ones this ordering exists for.\n */\nexport function normalizeAccessPolicy(rule: AccessControlled | AccessPolicy | undefined): AccessPolicy {\n if (!rule) return {}\n const { access: nested, ...flat } = rule as AccessPolicy & { access?: AccessPolicy }\n const policy = { ...flat } as Record<string, unknown>\n\n for (const [field, value] of Object.entries(nested ?? {})) {\n if (value !== undefined) policy[field] = value\n }\n\n return policy as AccessPolicy\n}\n\nexport function canAccessByPolicy(\n user: PermissionUser | null | undefined,\n rule: AccessControlled | AccessPolicy | undefined,\n isAuthenticated = user !== null && user !== undefined,\n): boolean {\n const policy = normalizeAccessPolicy(rule)\n if (policy.requiresAuth && !isAuthenticated) return false\n if (policy.requiresAdmin && !isAdminUser(user)) return false\n if (!audienceAllowsUser(policy.visibleFor ?? policy.audience, user)) return false\n if (!hasAllPermissions(user, policy.permissions)) return false\n if (!hasAnyPermission(user, policy.anyPermissions)) return false\n if (policy.plugin && !canAccessPlugin(user, policy.plugin)) return false\n return true\n}\n\nfunction audienceAllowsUser(\n audience: AccessAudienceInput | undefined,\n user: PermissionUser | null | undefined,\n): boolean {\n if (audience === undefined) return true\n const allowed = Array.isArray(audience) ? audience : [audience]\n if (allowed.includes('all')) return true\n return allowed.includes(getAccessAudience(user))\n}\n"],"mappings":";AAAA,IAAa,aAAa;AAE1B,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAiED,SAAgB,YAAY,MAA0D;AACpF,QAAO,MAAM,WAAW,MAAM,YAAY;;AAG5C,SAAgB,YAAY,MAA0C;AACpE,QAAO,SAAS;;AAGlB,SAAgB,YAAY,MAAkD;AAC5E,QAAO,YAAY,MAAM,KAAK,IAAI,YAAY,KAAK,EAAE,SAAA;;AAGvD,SAAgB,kBAAkB,MAAyE;AACzG,QAAO,YAAY,KAAK,GAAG,UAAU;;AAGvC,SAAgB,mBAAmB,MAAmD;CACpF,MAAM,kBAAkB,YAAY,KAAK,EAAE;AAC3C,KAAI,iBAAiB,OAAQ,QAAO,CAAC,GAAG,gBAAgB;AACxD,QAAO,CAAC,GAAI,MAAM,eAAe,EAAE,CAAE;;AAGvC,SAAgB,kBACd,MACA,cAAiC,EAAE,EAC1B;AACT,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,KAAI,YAAY,KAAK,CAAE,QAAO;CAC9B,MAAM,UAAU,IAAI,IAAI,mBAAmB,KAAK,CAAC;AACjD,QAAO,YAAY,OAAM,eAAc,QAAQ,IAAI,WAAW,CAAC;;AAGjE,SAAgB,iBACd,MACA,cAAiC,EAAE,EAC1B;AACT,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,KAAI,YAAY,KAAK,CAAE,QAAO;CAC9B,MAAM,UAAU,IAAI,IAAI,mBAAmB,KAAK,CAAC;AACjD,QAAO,YAAY,MAAK,eAAc,QAAQ,IAAI,WAAW,CAAC;;AAGhE,SAAgB,eAAe,MAAkD;AAC/E,QAAO,YAAY,KAAK,IAAI,iBAAiB,MAAM,wBAAwB;;AAG7E,SAAgB,gBACd,MACA,YACS;AACT,KAAI,CAAC,WAAY,QAAO;CACxB,MAAM,SAAS,YAAY,KAAK,EAAE;AAClC,KAAI,CAAC,UAAU,WAAW,MAAO,QAAO;AACxC,QAAO,MAAM,QAAQ,OAAO,IAAI,OAAO,SAAS,WAAW;;;;;;;;;;;;;;;;;;AAmB7D,SAAgB,sBAAsB,MAAiE;AACrG,KAAI,CAAC,KAAM,QAAO,EAAE;CACpB,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS;CACpC,MAAM,SAAS,EAAE,GAAG,MAAM;AAE1B,MAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,UAAU,EAAE,CAAC,CACvD,KAAI,UAAU,KAAA,EAAW,QAAO,SAAS;AAG3C,QAAO;;AAGT,SAAgB,kBACd,MACA,MACA,kBAAkB,SAAS,QAAQ,SAAS,KAAA,GACnC;CACT,MAAM,SAAS,sBAAsB,KAAK;AAC1C,KAAI,OAAO,gBAAgB,CAAC,gBAAiB,QAAO;AACpD,KAAI,OAAO,iBAAiB,CAAC,YAAY,KAAK,CAAE,QAAO;AACvD,KAAI,CAAC,mBAAmB,OAAO,cAAc,OAAO,UAAU,KAAK,CAAE,QAAO;AAC5E,KAAI,CAAC,kBAAkB,MAAM,OAAO,YAAY,CAAE,QAAO;AACzD,KAAI,CAAC,iBAAiB,MAAM,OAAO,eAAe,CAAE,QAAO;AAC3D,KAAI,OAAO,UAAU,CAAC,gBAAgB,MAAM,OAAO,OAAO,CAAE,QAAO;AACnE,QAAO;;AAGT,SAAS,mBACP,UACA,MACS;AACT,KAAI,aAAa,KAAA,EAAW,QAAO;CACnC,MAAM,UAAU,MAAM,QAAQ,SAAS,GAAG,WAAW,CAAC,SAAS;AAC/D,KAAI,QAAQ,SAAS,MAAM,CAAE,QAAO;AACpC,QAAO,QAAQ,SAAS,kBAAkB,KAAK,CAAC"}
|
package/dist/stores/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { useAuthStore } from './auth';
|
|
2
|
-
export { useSettingsStore, colorPalettes, type SettingsState } from './settings';
|
|
2
|
+
export { useSettingsStore, tryUseSettingsStore, colorPalettes, paletteCssVariables, tableDensityToSize, PALETTE_CSS_VARIABLES, type SettingsState, } from './settings';
|
|
3
3
|
export { useExperimentStore } from './experiment';
|
package/dist/stores/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import { t as useExperimentStore } from "../experiment-
|
|
3
|
-
export { colorPalettes, useAuthStore, useExperimentStore, useSettingsStore };
|
|
1
|
+
import { a as useAuthStore, c as paletteCssVariables, d as useSettingsStore, l as tableDensityToSize, o as PALETTE_CSS_VARIABLES, s as colorPalettes, u as tryUseSettingsStore } from "../errors-_W0-LbA6.js";
|
|
2
|
+
import { t as useExperimentStore } from "../experiment-Cwl9AYxw.js";
|
|
3
|
+
export { PALETTE_CSS_VARIABLES, colorPalettes, paletteCssVariables, tableDensityToSize, tryUseSettingsStore, useAuthStore, useExperimentStore, useSettingsStore };
|
|
@@ -21,6 +21,18 @@ export declare const colorPalettes: Record<ColorPalette, {
|
|
|
21
21
|
name: string;
|
|
22
22
|
hues: [number, number];
|
|
23
23
|
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Custom properties a non-default palette overrides on `<html>`.
|
|
26
|
+
*
|
|
27
|
+
* The saturation/lightness pairs are lifted from the canonical indigo/orange
|
|
28
|
+
* tokens in `styles/variables.css` so only the hue moves; the `default`
|
|
29
|
+
* palette writes nothing at all and the stylesheet values stand.
|
|
30
|
+
*/
|
|
31
|
+
export declare const PALETTE_CSS_VARIABLES: readonly ["--color-primary", "--color-primary-hover", "--color-primary-soft", "--color-cta", "--color-cta-hover"];
|
|
32
|
+
/** Build the `<html>` custom-property overrides for a palette. */
|
|
33
|
+
export declare function paletteCssVariables(palette: ColorPalette): Record<string, string>;
|
|
34
|
+
/** Map a table density onto the `size` prop shared by the SDK table components. */
|
|
35
|
+
export declare function tableDensityToSize(density: TableDensity): 'sm' | 'md' | 'lg';
|
|
24
36
|
export declare const useSettingsStore: import('pinia').StoreDefinition<"mint-settings", Pick<{
|
|
25
37
|
serverHost: import('vue').Ref<string, string>;
|
|
26
38
|
serverPort: import('vue').Ref<number, number>;
|
|
@@ -33,9 +45,12 @@ export declare const useSettingsStore: import('pinia').StoreDefinition<"mint-set
|
|
|
33
45
|
tableDensity: import('vue').Ref<TableDensity, TableDensity>;
|
|
34
46
|
initialize: () => void;
|
|
35
47
|
applyTheme: () => void;
|
|
48
|
+
applyPalette: () => void;
|
|
49
|
+
applyDensity: () => void;
|
|
36
50
|
persistSettings: () => void;
|
|
37
51
|
resetToDefaults: () => void;
|
|
38
52
|
getPaletteHues: () => [number, number];
|
|
53
|
+
getTableSize: () => "sm" | "md" | "lg";
|
|
39
54
|
isDark: () => boolean;
|
|
40
55
|
getApiBaseUrl: () => string;
|
|
41
56
|
getWsBaseUrl: () => string;
|
|
@@ -51,9 +66,12 @@ export declare const useSettingsStore: import('pinia').StoreDefinition<"mint-set
|
|
|
51
66
|
tableDensity: import('vue').Ref<TableDensity, TableDensity>;
|
|
52
67
|
initialize: () => void;
|
|
53
68
|
applyTheme: () => void;
|
|
69
|
+
applyPalette: () => void;
|
|
70
|
+
applyDensity: () => void;
|
|
54
71
|
persistSettings: () => void;
|
|
55
72
|
resetToDefaults: () => void;
|
|
56
73
|
getPaletteHues: () => [number, number];
|
|
74
|
+
getTableSize: () => "sm" | "md" | "lg";
|
|
57
75
|
isDark: () => boolean;
|
|
58
76
|
getApiBaseUrl: () => string;
|
|
59
77
|
getWsBaseUrl: () => string;
|
|
@@ -69,10 +87,22 @@ export declare const useSettingsStore: import('pinia').StoreDefinition<"mint-set
|
|
|
69
87
|
tableDensity: import('vue').Ref<TableDensity, TableDensity>;
|
|
70
88
|
initialize: () => void;
|
|
71
89
|
applyTheme: () => void;
|
|
90
|
+
applyPalette: () => void;
|
|
91
|
+
applyDensity: () => void;
|
|
72
92
|
persistSettings: () => void;
|
|
73
93
|
resetToDefaults: () => void;
|
|
74
94
|
getPaletteHues: () => [number, number];
|
|
95
|
+
getTableSize: () => "sm" | "md" | "lg";
|
|
75
96
|
isDark: () => boolean;
|
|
76
97
|
getApiBaseUrl: () => string;
|
|
77
98
|
getWsBaseUrl: () => string;
|
|
78
|
-
}, "initialize" | "applyTheme" | "persistSettings" | "resetToDefaults" | "getPaletteHues" | "isDark" | "getApiBaseUrl" | "getWsBaseUrl">>;
|
|
99
|
+
}, "initialize" | "applyTheme" | "applyPalette" | "applyDensity" | "persistSettings" | "resetToDefaults" | "getPaletteHues" | "getTableSize" | "isDark" | "getApiBaseUrl" | "getWsBaseUrl">>;
|
|
100
|
+
/**
|
|
101
|
+
* Read the settings store without requiring Pinia to be installed.
|
|
102
|
+
*
|
|
103
|
+
* SDK components are mounted standalone (unit tests, Histoire stories, plugin
|
|
104
|
+
* previews) where no Pinia instance exists. They use this to pick up a user's
|
|
105
|
+
* preferences when the platform is running and fall back to their own defaults
|
|
106
|
+
* otherwise, instead of throwing.
|
|
107
|
+
*/
|
|
108
|
+
export declare function tryUseSettingsStore(): ReturnType<typeof useSettingsStore> | null;
|