windmill-components 1.352.9 → 1.362.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/assets/app.css +8 -45
- package/package/components/ApiConnectForm.svelte +1 -0
- package/package/components/ArgInput.svelte +5 -1
- package/package/components/ChangeInstanceUsername.svelte +20 -12
- package/package/components/ContentSearchInner.svelte +359 -0
- package/package/components/{ContentSearch.svelte.d.ts → ContentSearchInner.svelte.d.ts} +9 -5
- package/package/components/CustomPopover.svelte +73 -0
- package/package/components/CustomPopover.svelte.d.ts +29 -0
- package/package/components/DateTimeInput.svelte +29 -3
- package/package/components/DateTimeInput.svelte.d.ts +4 -0
- package/package/components/Dev.svelte +8 -3
- package/package/components/DurationMs.svelte +2 -2
- package/package/components/FlowBuilder.svelte +122 -24
- package/package/components/FlowBuilder.svelte.d.ts +1 -0
- package/package/components/FlowGraphViewerStep.svelte +2 -2
- package/package/components/FlowJobResult.svelte +5 -3
- package/package/components/FlowStatusViewer.svelte +4 -3
- package/package/components/FlowStatusViewerInner.svelte +265 -160
- package/package/components/FlowStatusViewerInner.svelte.d.ts +15 -2
- package/package/components/HighlightTheme.svelte +75 -77
- package/package/components/InputTransformForm.svelte +2 -0
- package/package/components/JobArgs.svelte +59 -44
- package/package/components/JobArgs.svelte.d.ts +2 -0
- package/package/components/LightweightArgInput.svelte +27 -2
- package/package/components/Path.svelte +3 -8
- package/package/components/Popover.svelte +1 -1
- package/package/components/ResourceEditor.svelte +3 -2
- package/package/components/ResourceEditorDrawer.svelte +4 -1
- package/package/components/ResourcePicker.svelte +1 -0
- package/package/components/RunChart.svelte +6 -3
- package/package/components/RunChart.svelte.d.ts +1 -0
- package/package/components/RunForm.svelte +24 -23
- package/package/components/RunForm.svelte.d.ts +0 -2
- package/package/components/SavedInputs.svelte +50 -39
- package/package/components/ScheduleEditorInner.svelte +26 -4
- package/package/components/ScriptBuilder.svelte +47 -22
- package/package/components/ScriptBuilder.svelte.d.ts +1 -0
- package/package/components/SearchItems.svelte +5 -4
- package/package/components/Summary.svelte +74 -0
- package/package/components/Summary.svelte.d.ts +16 -0
- package/package/components/apps/components/display/AppMarkdown.svelte +3 -2
- package/package/components/apps/components/display/AppMenu.svelte +2 -2
- package/package/components/apps/components/display/AppNavbar.svelte +94 -0
- package/package/components/apps/components/display/AppNavbar.svelte.d.ts +24 -0
- package/package/components/apps/components/display/AppNavbarItem.svelte +146 -0
- package/package/components/apps/components/display/AppNavbarItem.svelte.d.ts +27 -0
- package/package/components/apps/components/display/ResolveNavbarItemPath.svelte +21 -0
- package/package/components/apps/components/display/ResolveNavbarItemPath.svelte.d.ts +20 -0
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +16 -0
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +12 -16
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte.d.ts +1 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +5 -0
- package/package/components/apps/components/display/table/AppAggridTable.svelte +28 -6
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte +68 -43
- package/package/components/apps/components/inputs/AppDateSelect.svelte +284 -0
- package/package/components/apps/components/inputs/AppDateSelect.svelte.d.ts +21 -0
- package/package/components/apps/components/inputs/AppDateTimeInput.svelte +2 -0
- package/package/components/apps/components/inputs/AppFileInput.svelte +22 -27
- package/package/components/apps/components/inputs/AppFileInput.svelte.d.ts +1 -0
- package/package/components/apps/components/inputs/AppTextInput.svelte +1 -1
- package/package/components/apps/components/layout/AppDecisionTree.svelte +32 -30
- package/package/components/apps/components/layout/AppModal.svelte +17 -6
- package/package/components/apps/editor/AppDeploymentHistory.svelte +2 -3
- package/package/components/apps/editor/AppDeploymentHistory.svelte.d.ts +3 -2
- package/package/components/apps/editor/AppEditor.svelte +9 -2
- package/package/components/apps/editor/AppEditorHeader.svelte +7 -10
- package/package/components/apps/editor/AppPreview.svelte +12 -3
- package/package/components/apps/editor/AppPreview.svelte.d.ts +2 -0
- package/package/components/apps/editor/DecisionTreeDebug.svelte +92 -68
- package/package/components/apps/editor/DeploymentHistory.svelte +0 -2
- package/package/components/apps/editor/appUtils.d.ts +1 -0
- package/package/components/apps/editor/appUtils.js +17 -0
- package/package/components/apps/editor/component/Component.svelte +23 -0
- package/package/components/apps/editor/component/components.d.ts +205 -3
- package/package/components/apps/editor/component/components.js +160 -1
- package/package/components/apps/editor/component/default-codes.js +13 -13
- package/package/components/apps/editor/component/sets.js +4 -2
- package/package/components/apps/editor/componentsPanel/ComponentList.svelte +12 -12
- package/package/components/apps/editor/componentsPanel/cssUtils.js +39 -3
- package/package/components/apps/editor/componentsPanel/quickStyleProperties.js +6 -0
- package/package/components/apps/editor/contextPanel/ComponentOutput.svelte +2 -2
- package/package/components/apps/editor/contextPanel/ContextPanel.svelte +6 -0
- package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +11 -0
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +4 -0
- package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +21 -8
- package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +64 -20
- package/package/components/apps/editor/settingsPanel/ContextVariables.svelte +48 -15
- package/package/components/apps/editor/settingsPanel/ContextVariables.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +25 -5
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +2 -1
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/DocLink.svelte +33 -0
- package/package/components/apps/editor/settingsPanel/DocLink.svelte.d.ts +19 -0
- package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +192 -0
- package/package/components/apps/editor/settingsPanel/GridNavbar.svelte.d.ts +18 -0
- package/package/components/apps/editor/settingsPanel/GridTab.svelte +2 -2
- package/package/components/apps/editor/settingsPanel/RefreshDatabaseStudioTable.svelte +17 -0
- package/package/components/apps/editor/settingsPanel/RefreshDatabaseStudioTable.svelte.d.ts +16 -0
- package/package/components/apps/editor/settingsPanel/TableActions.svelte +81 -38
- package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +12 -5
- package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +11 -12
- package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte.d.ts +4 -2
- package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +4 -1
- package/package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte +7 -1
- package/package/components/apps/inputType.d.ts +2 -2
- package/package/components/apps/svelte-select/lib/Select.svelte +2 -3
- package/package/components/apps/types.d.ts +3 -0
- package/package/components/auditLogs/AuditLogsTable.svelte +2 -2
- package/package/components/common/CloseButton.svelte +10 -10
- package/package/components/common/CloseButton.svelte.d.ts +6 -14
- package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -0
- package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
- package/package/components/common/confirmationModal/UnsavedConfirmationModal.svelte +7 -1
- package/package/components/common/fileInput/FileInput.svelte +2 -0
- package/package/components/common/fileInput/FileInput.svelte.d.ts +1 -0
- package/package/components/common/popup/Popup.svelte +4 -3
- package/package/components/common/popup/Popup.svelte.d.ts +1 -0
- package/package/components/common/table/AppRow.svelte +3 -10
- package/package/components/common/table/FlowRow.svelte +12 -1
- package/package/components/copilot/IteratorGen.svelte +1 -1
- package/package/components/copilot/PredicateGen.svelte +1 -1
- package/package/components/copilot/StepInputGen.svelte +8 -3
- package/package/components/copilot/StepInputsGen.svelte +5 -2
- package/package/components/details/WebhooksPanel.svelte +32 -1
- package/package/components/details/WebhooksPanel.svelte.d.ts +2 -11
- package/package/components/flows/FlowHistory.svelte +208 -0
- package/package/components/flows/FlowHistory.svelte.d.ts +21 -0
- package/package/components/flows/content/FlowBranchesAllWrapper.svelte +1 -1
- package/package/components/flows/content/FlowBranchesOneWrapper.svelte +1 -1
- package/package/components/flows/content/FlowEditorPanel.svelte +1 -1
- package/package/components/flows/content/FlowLoop.svelte +23 -26
- package/package/components/flows/content/FlowModuleComponent.svelte +2 -18
- package/package/components/flows/content/FlowModuleEarlyStop.svelte +10 -4
- package/package/components/flows/content/FlowModuleHeader.svelte +3 -4
- package/package/components/flows/content/FlowModuleScript.svelte +1 -1
- package/package/components/flows/content/FlowModuleSleep.svelte +1 -0
- package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
- package/package/components/flows/content/SuspendDrawer.svelte +7 -7
- package/package/components/flows/flowStateUtils.js +2 -1
- package/package/components/flows/flowStore.js +1 -1
- package/package/components/flows/header/FlowImportExportMenu.svelte +3 -16
- package/package/components/flows/header/FlowImportExportMenu.svelte.d.ts +4 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +69 -0
- package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +22 -0
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +7 -4
- package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
- package/package/components/flows/map/MapItem.svelte +20 -0
- package/package/components/flows/map/MapItem.svelte.d.ts +9 -0
- package/package/components/flows/map/VirtualItem.svelte +4 -2
- package/package/components/flows/map/VirtualItem.svelte.d.ts +1 -0
- package/package/components/flows/previousResults.d.ts +9 -0
- package/package/components/flows/previousResults.js +42 -8
- package/package/components/flows/propPicker/PropPickerWrapper.svelte +2 -0
- package/package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +1 -0
- package/package/components/flows/types.d.ts +1 -1
- package/package/components/graph/FlowGraph.svelte +80 -42
- package/package/components/graph/FlowGraph.svelte.d.ts +1 -0
- package/package/components/graph/model.d.ts +6 -1
- package/package/components/graph/svelvet/container/controllers/middleware.js +4 -4
- package/package/components/graph/svelvet/container/views/GraphView.svelte +2 -0
- package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +24 -25
- package/package/components/graph/util.d.ts +1 -1
- package/package/components/graph/util.js +1 -2
- package/package/components/home/ItemsList.svelte +22 -19
- package/package/components/jobs/JobPreview.svelte +11 -2
- package/package/components/propertyPicker/PropPicker.svelte +30 -0
- package/package/components/propertyPicker/PropPickerResult.svelte +14 -1
- package/package/components/propertyPicker/PropPickerResult.svelte.d.ts +1 -0
- package/package/components/runs/JobLoader.svelte +21 -8
- package/package/components/runs/JobLoader.svelte.d.ts +2 -0
- package/package/components/runs/JobPreview.svelte +5 -1
- package/package/components/runs/RunRow.svelte +12 -8
- package/package/components/runs/RunsFilter.svelte +2 -4
- package/package/components/runs/RunsFilter.svelte.d.ts +0 -1
- package/package/components/runs/RunsTable.svelte +63 -29
- package/package/components/runs/RunsTable.svelte.d.ts +1 -0
- package/package/components/schema/EditableSchemaWrapper.svelte +9 -1
- package/package/components/schema/PropertyEditor.svelte +1 -1
- package/package/components/search/GlobalSearchModal.svelte +559 -0
- package/package/components/search/GlobalSearchModal.svelte.d.ts +17 -0
- package/package/components/search/QuickMenuItem.svelte +76 -0
- package/package/components/search/QuickMenuItem.svelte.d.ts +27 -0
- package/package/components/sidebar/MenuButton.svelte +11 -0
- package/package/components/sidebar/MenuButton.svelte.d.ts +4 -0
- package/package/components/sidebar/changelogs.js +35 -0
- package/package/components/wizards/AppPicker.svelte +68 -0
- package/package/components/wizards/AppPicker.svelte.d.ts +17 -0
- package/package/components/wizards/NavbarWizard.svelte +131 -0
- package/package/components/wizards/NavbarWizard.svelte.d.ts +19 -0
- package/package/defaults.d.ts +1 -1
- package/package/defaults.js +1 -1
- package/package/es6.d.ts.txt +370 -1
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +42 -3
- package/package/gen/schemas.gen.js +42 -3
- package/package/gen/services.gen.d.ts +80 -5
- package/package/gen/services.gen.js +149 -8
- package/package/gen/types.gen.d.ts +265 -11
- package/package/inferArgSig.js +4 -0
- package/package/script_helpers.d.ts +3 -3
- package/package/script_helpers.js +46 -22
- package/package/stores.d.ts +1 -1
- package/package/stores.js +1 -1
- package/package/utils.d.ts +7 -23
- package/package/utils.js +54 -33
- package/package/windmill_fetch.d.ts.txt +6 -6
- package/package.json +3 -11
- package/package/components/ContentSearch.svelte +0 -355
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
<script>import { onDestroy, onMount, tick } from 'svelte';
|
|
2
|
+
import { AppService, FlowService, IndexSearchService, RawAppService, ScriptService } from '../../gen';
|
|
3
|
+
import { clickOutside, displayDateOnly, isMac, sendUserToast } from '../../utils';
|
|
4
|
+
import TimeAgo from '../TimeAgo.svelte';
|
|
5
|
+
import { BoxesIcon, CalendarIcon, Code2Icon, DollarSignIcon, HomeIcon, LayoutDashboardIcon, Loader2, PlayIcon, Search, SearchCode } from 'lucide-svelte';
|
|
6
|
+
import JobPreview from '../runs/JobPreview.svelte';
|
|
7
|
+
import Portal from 'svelte-portal';
|
|
8
|
+
import { twMerge } from 'tailwind-merge';
|
|
9
|
+
import ContentSearchInner from '../ContentSearchInner.svelte';
|
|
10
|
+
import { goto } from '$app/navigation';
|
|
11
|
+
import QuickMenuItem from '../search/QuickMenuItem.svelte';
|
|
12
|
+
import { enterpriseLicense, workspaceStore } from '../../stores';
|
|
13
|
+
import uFuzzy from '@leeoniya/ufuzzy';
|
|
14
|
+
import BarsStaggered from '../icons/BarsStaggered.svelte';
|
|
15
|
+
import { scroll_into_view_if_needed_polyfill } from '../multiselect/utils';
|
|
16
|
+
import { Alert } from '../common';
|
|
17
|
+
let open = false;
|
|
18
|
+
let searchTerm = '';
|
|
19
|
+
let textInput;
|
|
20
|
+
let selectedWorkspace = undefined;
|
|
21
|
+
let contentSearch = undefined;
|
|
22
|
+
const RUNS_PREFIX = '>';
|
|
23
|
+
const LOGS_PREFIX = '!';
|
|
24
|
+
const CONTENT_SEARCH_PREFIX = '#';
|
|
25
|
+
const SWITCH_MODE_PREFIX = '?';
|
|
26
|
+
let tab = 'default';
|
|
27
|
+
let switchModeItems = [
|
|
28
|
+
{
|
|
29
|
+
search_id: 'switchto:run-search',
|
|
30
|
+
label: 'Search across completed runs',
|
|
31
|
+
action: () => switchMode('runs'),
|
|
32
|
+
shortcutKey: RUNS_PREFIX,
|
|
33
|
+
icon: Search
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
search_id: 'switchto:content-search',
|
|
37
|
+
label: 'Search scripts/flows/apps based on content',
|
|
38
|
+
action: () => switchMode('content'),
|
|
39
|
+
shortcutKey: CONTENT_SEARCH_PREFIX,
|
|
40
|
+
icon: SearchCode
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
search_id: 'switchto:log-search',
|
|
44
|
+
label: 'Search windmill logs',
|
|
45
|
+
action: () => switchMode('logs'),
|
|
46
|
+
shortcutKey: LOGS_PREFIX,
|
|
47
|
+
icon: Search
|
|
48
|
+
}
|
|
49
|
+
];
|
|
50
|
+
let defaultMenuItems = [
|
|
51
|
+
{ search_id: 'nav:home', label: 'Go to Home', action: () => gotoPage('/'), icon: HomeIcon },
|
|
52
|
+
{ search_id: 'nav:runs', label: 'Go to Runs', action: () => gotoPage('/runs'), icon: PlayIcon },
|
|
53
|
+
{
|
|
54
|
+
search_id: 'nav:variables',
|
|
55
|
+
label: 'Go to Variables',
|
|
56
|
+
action: () => gotoPage('/variables'),
|
|
57
|
+
icon: DollarSignIcon
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
search_id: 'nav:resources',
|
|
61
|
+
label: 'Go to Resources',
|
|
62
|
+
action: () => gotoPage('/resources'),
|
|
63
|
+
icon: BoxesIcon
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
search_id: 'nav:schedules',
|
|
67
|
+
label: 'Go to Schedules',
|
|
68
|
+
action: () => gotoPage('/schedules'),
|
|
69
|
+
icon: CalendarIcon
|
|
70
|
+
},
|
|
71
|
+
...switchModeItems
|
|
72
|
+
];
|
|
73
|
+
let itemMap = {
|
|
74
|
+
default: defaultMenuItems,
|
|
75
|
+
'switch-mode': switchModeItems,
|
|
76
|
+
runs: [],
|
|
77
|
+
content: [],
|
|
78
|
+
logs: []
|
|
79
|
+
};
|
|
80
|
+
$: tab === 'content' && contentSearch?.open();
|
|
81
|
+
async function switchPrompt(tab) {
|
|
82
|
+
if (tab === 'default') {
|
|
83
|
+
searchTerm = '';
|
|
84
|
+
}
|
|
85
|
+
if (tab === 'runs') {
|
|
86
|
+
searchTerm = RUNS_PREFIX;
|
|
87
|
+
}
|
|
88
|
+
if (tab === 'content') {
|
|
89
|
+
searchTerm = CONTENT_SEARCH_PREFIX;
|
|
90
|
+
}
|
|
91
|
+
if (tab === 'switch-mode') {
|
|
92
|
+
searchTerm = SWITCH_MODE_PREFIX;
|
|
93
|
+
}
|
|
94
|
+
if (tab === 'logs') {
|
|
95
|
+
searchTerm = LOGS_PREFIX;
|
|
96
|
+
}
|
|
97
|
+
selectedItem = selectItem(0);
|
|
98
|
+
textInput.focus();
|
|
99
|
+
}
|
|
100
|
+
function removePrefix(str, prefix) {
|
|
101
|
+
if (str.startsWith(prefix)) {
|
|
102
|
+
return str.substring(prefix.length);
|
|
103
|
+
}
|
|
104
|
+
return str;
|
|
105
|
+
}
|
|
106
|
+
let opts = {};
|
|
107
|
+
let uf = new uFuzzy(opts);
|
|
108
|
+
let defaultMenuItemLabels = defaultMenuItems.map((item) => item.label);
|
|
109
|
+
let switchModeItemLabels = switchModeItems.map((item) => item.label);
|
|
110
|
+
function fuzzyFilter(filter, items, itemsPlainText) {
|
|
111
|
+
if (filter === '') {
|
|
112
|
+
return items;
|
|
113
|
+
}
|
|
114
|
+
let idxs = uf.filter(itemsPlainText, filter) ?? [];
|
|
115
|
+
let info;
|
|
116
|
+
// parts is undefined error happens when filter is similar
|
|
117
|
+
// to `.>!` (string with no letters but some symbols)
|
|
118
|
+
try {
|
|
119
|
+
info = uf.info(idxs, itemsPlainText, filter);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
return items;
|
|
123
|
+
}
|
|
124
|
+
let order = uf.sort(info, itemsPlainText, filter);
|
|
125
|
+
let r = [];
|
|
126
|
+
for (let o of order) {
|
|
127
|
+
r.push(items[info.idx[o]]);
|
|
128
|
+
}
|
|
129
|
+
return r;
|
|
130
|
+
}
|
|
131
|
+
let debounceTimeout = undefined;
|
|
132
|
+
const debouncePeriod = 1000;
|
|
133
|
+
let loadingCompletedRuns = false;
|
|
134
|
+
async function handleSearch() {
|
|
135
|
+
if (tab !== 'default' &&
|
|
136
|
+
(searchTerm === '' ||
|
|
137
|
+
![RUNS_PREFIX, LOGS_PREFIX, CONTENT_SEARCH_PREFIX, SWITCH_MODE_PREFIX].includes(searchTerm[0]))) {
|
|
138
|
+
_switchMode('default');
|
|
139
|
+
}
|
|
140
|
+
if (tab != 'switch-mode' && searchTerm.length > 0 && searchTerm[0] === SWITCH_MODE_PREFIX) {
|
|
141
|
+
_switchMode('switch-mode');
|
|
142
|
+
}
|
|
143
|
+
if (tab != 'logs' && searchTerm.length > 0 && searchTerm[0] === LOGS_PREFIX) {
|
|
144
|
+
_switchMode('logs');
|
|
145
|
+
}
|
|
146
|
+
if (tab != 'runs' && searchTerm.length > 0 && searchTerm[0] === RUNS_PREFIX) {
|
|
147
|
+
_switchMode('runs');
|
|
148
|
+
}
|
|
149
|
+
if (tab != 'content' && searchTerm.length > 0 && searchTerm[0] === CONTENT_SEARCH_PREFIX) {
|
|
150
|
+
_switchMode('content');
|
|
151
|
+
}
|
|
152
|
+
if (tab === 'default') {
|
|
153
|
+
itemMap['default'] = fuzzyFilter(searchTerm, defaultMenuItems, defaultMenuItemLabels);
|
|
154
|
+
if (combinedItems) {
|
|
155
|
+
itemMap['default'] = itemMap['default'].concat(fuzzyFilter(searchTerm, combinedItems, combinedItems.map((i) => `${i.path} ${i.summary}`)));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (tab === 'switch-mode') {
|
|
159
|
+
itemMap['switch-mode'] = fuzzyFilter(removePrefix(searchTerm, SWITCH_MODE_PREFIX), switchModeItems, switchModeItemLabels);
|
|
160
|
+
}
|
|
161
|
+
if (tab === 'runs') {
|
|
162
|
+
const s = removePrefix(searchTerm, RUNS_PREFIX);
|
|
163
|
+
clearTimeout(debounceTimeout);
|
|
164
|
+
loadingCompletedRuns = true;
|
|
165
|
+
debounceTimeout = setTimeout(async () => {
|
|
166
|
+
clearTimeout(debounceTimeout);
|
|
167
|
+
let searchResults;
|
|
168
|
+
try {
|
|
169
|
+
searchResults = await IndexSearchService.searchJobsIndex({
|
|
170
|
+
searchQuery: s,
|
|
171
|
+
workspace: $workspaceStore
|
|
172
|
+
});
|
|
173
|
+
itemMap['runs'] = searchResults.hits;
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
sendUserToast(e, true);
|
|
177
|
+
}
|
|
178
|
+
loadingCompletedRuns = false;
|
|
179
|
+
selectedItem = selectItem(0);
|
|
180
|
+
}, debouncePeriod);
|
|
181
|
+
}
|
|
182
|
+
selectedItem = selectItem(0);
|
|
183
|
+
}
|
|
184
|
+
function selectItem(index) {
|
|
185
|
+
if (!itemMap[tab] || itemMap[tab].length <= index) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
onHover(itemMap[tab][index]);
|
|
189
|
+
return itemMap[tab][index];
|
|
190
|
+
}
|
|
191
|
+
let selectedItem;
|
|
192
|
+
async function handleKeydown(event) {
|
|
193
|
+
if ((!isMac() ? event.ctrlKey : event.metaKey) && event.key === 'k') {
|
|
194
|
+
event.preventDefault();
|
|
195
|
+
await openModal();
|
|
196
|
+
}
|
|
197
|
+
if (open) {
|
|
198
|
+
if (event.key === 'Escape') {
|
|
199
|
+
event.preventDefault();
|
|
200
|
+
if (searchTerm.length != 0 || tab != 'default') {
|
|
201
|
+
switchMode('default');
|
|
202
|
+
textInput?.focus();
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
open = false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (event.key === 'ArrowDown') {
|
|
209
|
+
event.preventDefault();
|
|
210
|
+
let idx = itemMap[tab].indexOf(selectedItem);
|
|
211
|
+
if (idx != -1) {
|
|
212
|
+
idx = (idx + 1) % itemMap[tab].length;
|
|
213
|
+
selectedItem = selectItem(idx);
|
|
214
|
+
let el = document.getElementById(selectedItem.search_id);
|
|
215
|
+
if (el)
|
|
216
|
+
scroll_into_view_if_needed_polyfill(el, false);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (event.key === 'ArrowUp') {
|
|
220
|
+
event.preventDefault();
|
|
221
|
+
let idx = itemMap[tab].indexOf(selectedItem);
|
|
222
|
+
if (idx != -1) {
|
|
223
|
+
idx = (idx - 1 + itemMap[tab].length) % itemMap[tab].length;
|
|
224
|
+
selectedItem = selectItem(idx);
|
|
225
|
+
let el = document.getElementById(selectedItem.search_id);
|
|
226
|
+
if (el)
|
|
227
|
+
scroll_into_view_if_needed_polyfill(el, false);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//internal, should not be called outside of the handleSearch function
|
|
233
|
+
function _switchMode(mode) {
|
|
234
|
+
selectedItem = undefined;
|
|
235
|
+
tab = mode;
|
|
236
|
+
}
|
|
237
|
+
// Used by callbacks, call this to change the mode
|
|
238
|
+
function switchMode(mode) {
|
|
239
|
+
switchPrompt(mode);
|
|
240
|
+
textInput.focus();
|
|
241
|
+
}
|
|
242
|
+
function gotoWindmillItemPage(e) {
|
|
243
|
+
let path;
|
|
244
|
+
switch (e.type) {
|
|
245
|
+
case 'flow':
|
|
246
|
+
path = `/flows/get/${e.path}`;
|
|
247
|
+
break;
|
|
248
|
+
case 'script':
|
|
249
|
+
path = `/scripts/get/${e.path}`;
|
|
250
|
+
break;
|
|
251
|
+
case 'app':
|
|
252
|
+
path = `/apps/get/${e.path}`;
|
|
253
|
+
break;
|
|
254
|
+
case 'raw_app':
|
|
255
|
+
path = `/raw_apps/get/${e.path}`;
|
|
256
|
+
break;
|
|
257
|
+
default:
|
|
258
|
+
path = '/';
|
|
259
|
+
}
|
|
260
|
+
gotoPage(path);
|
|
261
|
+
}
|
|
262
|
+
function gotoPage(path) {
|
|
263
|
+
open = false;
|
|
264
|
+
searchTerm = '';
|
|
265
|
+
goto(path);
|
|
266
|
+
}
|
|
267
|
+
onMount(() => {
|
|
268
|
+
window.addEventListener('keydown', handleKeydown);
|
|
269
|
+
});
|
|
270
|
+
onDestroy(() => {
|
|
271
|
+
window.removeEventListener('keydown', handleKeydown);
|
|
272
|
+
});
|
|
273
|
+
$: searchTerm, handleSearch();
|
|
274
|
+
function placeholderFromPrefix(text) {
|
|
275
|
+
switch (text) {
|
|
276
|
+
case '':
|
|
277
|
+
return ' Search or type `?` for search options';
|
|
278
|
+
case RUNS_PREFIX:
|
|
279
|
+
return ' Search across completed runs';
|
|
280
|
+
case LOGS_PREFIX:
|
|
281
|
+
return ' Search across completed runs';
|
|
282
|
+
case CONTENT_SEARCH_PREFIX:
|
|
283
|
+
return ' Search flows/scripts/apps by content';
|
|
284
|
+
default:
|
|
285
|
+
return '';
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
let combinedItems = undefined;
|
|
289
|
+
async function fetchCombinedItems() {
|
|
290
|
+
const scripts = await ScriptService.listScripts({
|
|
291
|
+
workspace: $workspaceStore
|
|
292
|
+
});
|
|
293
|
+
const flows = await FlowService.listFlows({
|
|
294
|
+
workspace: $workspaceStore
|
|
295
|
+
});
|
|
296
|
+
const apps = await AppService.listApps({ workspace: $workspaceStore });
|
|
297
|
+
const raw_apps = await RawAppService.listRawApps({ workspace: $workspaceStore });
|
|
298
|
+
let combinedItems = [
|
|
299
|
+
...flows.map((x) => ({
|
|
300
|
+
...x,
|
|
301
|
+
type: 'flow',
|
|
302
|
+
time: new Date(x.edited_at).getTime(),
|
|
303
|
+
search_id: x.path
|
|
304
|
+
})),
|
|
305
|
+
...scripts.map((x) => ({
|
|
306
|
+
...x,
|
|
307
|
+
type: 'script',
|
|
308
|
+
time: new Date(x.created_at).getTime(),
|
|
309
|
+
search_id: x.path
|
|
310
|
+
})),
|
|
311
|
+
...apps.map((x) => ({
|
|
312
|
+
...x,
|
|
313
|
+
type: 'app',
|
|
314
|
+
time: new Date(x.edited_at).getTime(),
|
|
315
|
+
search_id: x.path
|
|
316
|
+
})),
|
|
317
|
+
...raw_apps.map((x) => ({
|
|
318
|
+
...x,
|
|
319
|
+
type: 'raw_app',
|
|
320
|
+
time: new Date(x.edited_at).getTime(),
|
|
321
|
+
search_id: x.path
|
|
322
|
+
}))
|
|
323
|
+
].sort((a, b) => (a.starred != b.starred ? (a.starred ? -1 : 1) : a.time - b.time > 0 ? -1 : 1));
|
|
324
|
+
return combinedItems;
|
|
325
|
+
}
|
|
326
|
+
function iconForWindmillItem(type) {
|
|
327
|
+
switch (type) {
|
|
328
|
+
case 'flow':
|
|
329
|
+
return BarsStaggered;
|
|
330
|
+
case 'script':
|
|
331
|
+
return Code2Icon;
|
|
332
|
+
case 'app':
|
|
333
|
+
return LayoutDashboardIcon;
|
|
334
|
+
case 'raw_app':
|
|
335
|
+
return LayoutDashboardIcon;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function onHover(selectedItem) {
|
|
339
|
+
if (tab === 'runs') {
|
|
340
|
+
selectedWorkspace = selectedItem?.document?.workspace_id[0];
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
export async function openSearchWithPrefilledText(text) {
|
|
344
|
+
await openModal();
|
|
345
|
+
searchTerm = text ?? searchTerm;
|
|
346
|
+
await handleSearch();
|
|
347
|
+
}
|
|
348
|
+
async function openModal() {
|
|
349
|
+
open = !open;
|
|
350
|
+
await tick();
|
|
351
|
+
if (open) {
|
|
352
|
+
if (combinedItems == undefined) {
|
|
353
|
+
combinedItems = await fetchCombinedItems();
|
|
354
|
+
handleSearch();
|
|
355
|
+
}
|
|
356
|
+
selectedItem = selectItem(0);
|
|
357
|
+
textInput.focus();
|
|
358
|
+
textInput.select();
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
</script>
|
|
362
|
+
|
|
363
|
+
{#if open}
|
|
364
|
+
<Portal>
|
|
365
|
+
<div
|
|
366
|
+
class={twMerge(
|
|
367
|
+
`fixed top-0 bottom-0 left-0 right-0 transition-all duration-50`,
|
|
368
|
+
' bg-black bg-opacity-40',
|
|
369
|
+
'z-[1100]'
|
|
370
|
+
)}
|
|
371
|
+
>
|
|
372
|
+
<div
|
|
373
|
+
class={'max-w-4xl lg:mx-auto mx-10 mt-40 bg-surface rounded-lg relative'}
|
|
374
|
+
use:clickOutside={false}
|
|
375
|
+
on:click_outside={() => {
|
|
376
|
+
open = false
|
|
377
|
+
}}
|
|
378
|
+
>
|
|
379
|
+
<div class="py-2 items-center">
|
|
380
|
+
<div class="px-4 flex flex-row gap-1 items-center pb-1 mb-2 border-b">
|
|
381
|
+
<Search />
|
|
382
|
+
<div class="relative inline-block w-full">
|
|
383
|
+
<input
|
|
384
|
+
id="quickSearchInput"
|
|
385
|
+
bind:this={textInput}
|
|
386
|
+
type="text"
|
|
387
|
+
class="quick-search-input"
|
|
388
|
+
bind:value={searchTerm}
|
|
389
|
+
/>
|
|
390
|
+
<label
|
|
391
|
+
for="quickSearchInput"
|
|
392
|
+
class="absolute top-1/2 left-2 transform -translate-y-1/2 pointer-events-none text-gray-400 transition-all duration-200 whitespace-pre"
|
|
393
|
+
>{placeholderFromPrefix(searchTerm)}</label
|
|
394
|
+
>
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
<div class="px-4 overflow-scroll max-h-[30rem]">
|
|
398
|
+
{#if tab === 'default' || tab === 'switch-mode'}
|
|
399
|
+
{#each (itemMap[tab] ?? []).filter((e) => defaultMenuItems.includes(e)) as el}
|
|
400
|
+
<QuickMenuItem
|
|
401
|
+
on:select={el?.action}
|
|
402
|
+
on:hover={() => (selectedItem = el)}
|
|
403
|
+
id={el?.search_id}
|
|
404
|
+
hovered={el?.search_id === selectedItem?.search_id}
|
|
405
|
+
label={el?.label}
|
|
406
|
+
icon={el?.icon}
|
|
407
|
+
shortcutKey={el?.shortcutKey}
|
|
408
|
+
/>
|
|
409
|
+
{/each}
|
|
410
|
+
{/if}
|
|
411
|
+
{#if tab === 'default'}
|
|
412
|
+
{#if (itemMap[tab] ?? []).filter((e) => (combinedItems ?? []).includes(e)).length > 0}
|
|
413
|
+
<div class="mt-2 pt-2 pb-1 px-1 text-xs text-sm font-bold border-t text-tertiary"
|
|
414
|
+
>Flows/Scripts/Apps</div
|
|
415
|
+
>
|
|
416
|
+
{/if}
|
|
417
|
+
{#each (itemMap[tab] ?? []).filter((e) => (combinedItems ?? []).includes(e)) as el}
|
|
418
|
+
<QuickMenuItem
|
|
419
|
+
on:select={() => gotoWindmillItemPage(el)}
|
|
420
|
+
on:hover={() => (selectedItem = el)}
|
|
421
|
+
id={el?.search_id}
|
|
422
|
+
hovered={el?.path === selectedItem?.path}
|
|
423
|
+
label={(el.summary ? `${el.summary} - ` : '') +
|
|
424
|
+
el.path +
|
|
425
|
+
(el.starred ? ' ★' : '')}
|
|
426
|
+
icon={iconForWindmillItem(el.type)}
|
|
427
|
+
/>
|
|
428
|
+
{/each}
|
|
429
|
+
{#if (itemMap[tab] ?? []).length === 0}
|
|
430
|
+
<div class="flex w-full justify-center items-center h-48">
|
|
431
|
+
<div class="text-tertiary text-center">
|
|
432
|
+
<div class="text-2xl font-bold">Nothing found</div>
|
|
433
|
+
<div class="text-sm">Tip: press `esc` to quickly clear the search bar</div>
|
|
434
|
+
</div>
|
|
435
|
+
</div>
|
|
436
|
+
{/if}
|
|
437
|
+
{:else if tab === 'content'}
|
|
438
|
+
<ContentSearchInner
|
|
439
|
+
classNameInner="max-h-[20rem]"
|
|
440
|
+
search={removePrefix(searchTerm, '#')}
|
|
441
|
+
bind:this={contentSearch}
|
|
442
|
+
/>
|
|
443
|
+
{:else if tab === 'logs'}
|
|
444
|
+
<div class="p-2">
|
|
445
|
+
<Alert title="Service log search is coming soon" type="info">
|
|
446
|
+
Full text search on windmill's service logs is coming soon
|
|
447
|
+
</Alert>
|
|
448
|
+
</div>
|
|
449
|
+
{:else if tab === 'runs'}
|
|
450
|
+
<div class="flex h-96">
|
|
451
|
+
{#if loadingCompletedRuns}
|
|
452
|
+
<div class="flex w-full justify-center items-center h-48">
|
|
453
|
+
<div class="text-tertiary text-center">
|
|
454
|
+
<Loader2 size={34} class="animate-spin" />
|
|
455
|
+
</div>
|
|
456
|
+
</div>
|
|
457
|
+
{:else if itemMap['runs'] && itemMap['runs'].length > 0}
|
|
458
|
+
<div class="w-5/12 overflow-scroll">
|
|
459
|
+
{#each itemMap['runs'] ?? [] as r}
|
|
460
|
+
<QuickMenuItem
|
|
461
|
+
on:hover={() => {
|
|
462
|
+
selectedItem = r
|
|
463
|
+
selectedWorkspace = r?.document.workspace_id[0]
|
|
464
|
+
}}
|
|
465
|
+
on:select={() => {
|
|
466
|
+
open = false
|
|
467
|
+
goto(`/run/${r?.document.id[0]}`)
|
|
468
|
+
}}
|
|
469
|
+
id={r?.document.id[0]}
|
|
470
|
+
hovered={selectedItem && r?.document.id[0] === selectedItem?.document.id[0]}
|
|
471
|
+
icon={r?.icon}
|
|
472
|
+
>
|
|
473
|
+
<svelte:fragment slot="itemReplacement">
|
|
474
|
+
<button
|
|
475
|
+
class={twMerge(
|
|
476
|
+
`w-full flex items-center justify-between gap-1 py-2 px-2 text-left border rounded-sm transition-a`,
|
|
477
|
+
r?.document.id === selectedItem?.document?.id
|
|
478
|
+
? 'bg-surface-hover'
|
|
479
|
+
: ''
|
|
480
|
+
)}
|
|
481
|
+
on:click={() => {}}
|
|
482
|
+
>
|
|
483
|
+
<div
|
|
484
|
+
class="w-full h-full items-center text-xs font-normal grid grid-cols-10 gap-0 min-w-0"
|
|
485
|
+
>
|
|
486
|
+
<div class="col-span-1">
|
|
487
|
+
<div
|
|
488
|
+
class="rounded-full w-2 h-2 {r?.document.success[0]
|
|
489
|
+
? 'bg-green-400'
|
|
490
|
+
: 'bg-red-400'}"
|
|
491
|
+
/>
|
|
492
|
+
</div>
|
|
493
|
+
<div class="col-span-5">
|
|
494
|
+
{r?.document.script_path}
|
|
495
|
+
</div>
|
|
496
|
+
<div
|
|
497
|
+
class="whitespace-nowrap col-span-2 !text-tertiary !text-2xs overflow-hidden text-ellipsis flex-shrink text-center"
|
|
498
|
+
>
|
|
499
|
+
{displayDateOnly(new Date(r?.document.created_at[0]))}
|
|
500
|
+
</div>
|
|
501
|
+
<div
|
|
502
|
+
class="whitespace-nowrap col-span-2 !text-tertiary !text-2xs overflow-hidden text-ellipsis flex-shrink text-center"
|
|
503
|
+
>
|
|
504
|
+
<TimeAgo date={r?.document.created_at[0] ?? ''} />
|
|
505
|
+
</div>
|
|
506
|
+
</div>
|
|
507
|
+
</button>
|
|
508
|
+
</svelte:fragment>
|
|
509
|
+
</QuickMenuItem>
|
|
510
|
+
{/each}
|
|
511
|
+
</div>
|
|
512
|
+
{#if selectedItem === undefined}
|
|
513
|
+
select a result to preview
|
|
514
|
+
{:else}
|
|
515
|
+
<div class="w-7/12 overflow-y-scroll">
|
|
516
|
+
<JobPreview
|
|
517
|
+
id={selectedItem?.document?.id[0]}
|
|
518
|
+
workspace={selectedWorkspace}
|
|
519
|
+
/>
|
|
520
|
+
</div>
|
|
521
|
+
{/if}
|
|
522
|
+
{:else}
|
|
523
|
+
<div class="flex w-full justify-center items-center h-96">
|
|
524
|
+
<div class="text-tertiary text-center">
|
|
525
|
+
<div class="text-2xl font-bold">No runs found</div>
|
|
526
|
+
<div class="text-sm">There were no completed runs that match your query</div>
|
|
527
|
+
<div class="text-sm"
|
|
528
|
+
>Note that new runs might take a while to become searchable (by default
|
|
529
|
+
~5min)</div
|
|
530
|
+
>
|
|
531
|
+
{#if !$enterpriseLicense}
|
|
532
|
+
<div class="py-6" />
|
|
533
|
+
|
|
534
|
+
<Alert title="This is an EE feature" type="warning">
|
|
535
|
+
Full-text search on jobs is only available on EE.
|
|
536
|
+
</Alert>
|
|
537
|
+
{/if}
|
|
538
|
+
</div>
|
|
539
|
+
</div>
|
|
540
|
+
{/if}
|
|
541
|
+
</div>
|
|
542
|
+
{/if}
|
|
543
|
+
</div>
|
|
544
|
+
</div>
|
|
545
|
+
</div>
|
|
546
|
+
</div>
|
|
547
|
+
</Portal>
|
|
548
|
+
{/if}
|
|
549
|
+
|
|
550
|
+
<style>
|
|
551
|
+
.quick-search-input {
|
|
552
|
+
outline: none;
|
|
553
|
+
border: none !important;
|
|
554
|
+
box-shadow: none !important;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.quick-search-input:focus-visible {
|
|
558
|
+
outline: none !important;
|
|
559
|
+
}</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
openSearchWithPrefilledText?: ((text?: string) => Promise<void>) | undefined;
|
|
5
|
+
};
|
|
6
|
+
events: {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
};
|
|
9
|
+
slots: {};
|
|
10
|
+
};
|
|
11
|
+
export type GlobalSearchModalProps = typeof __propDef.props;
|
|
12
|
+
export type GlobalSearchModalEvents = typeof __propDef.events;
|
|
13
|
+
export type GlobalSearchModalSlots = typeof __propDef.slots;
|
|
14
|
+
export default class GlobalSearchModal extends SvelteComponent<GlobalSearchModalProps, GlobalSearchModalEvents, GlobalSearchModalSlots> {
|
|
15
|
+
get openSearchWithPrefilledText(): (text?: string | undefined) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<script>import { isMac } from '../../utils';
|
|
2
|
+
import { createEventDispatcher, onDestroy, onMount } from 'svelte';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
export let hovered = false;
|
|
5
|
+
export let id;
|
|
6
|
+
export let label = '';
|
|
7
|
+
export let icon = undefined;
|
|
8
|
+
export let shortcutKey = undefined;
|
|
9
|
+
const dispatch = createEventDispatcher();
|
|
10
|
+
onMount(() => {
|
|
11
|
+
window.addEventListener('keydown', handleKeydown);
|
|
12
|
+
});
|
|
13
|
+
onDestroy(() => {
|
|
14
|
+
window.removeEventListener('keydown', handleKeydown);
|
|
15
|
+
});
|
|
16
|
+
async function handleKeydown(event) {
|
|
17
|
+
if (hovered && event.key === 'Enter') {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
runAction();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function runAction() {
|
|
23
|
+
dispatch('select');
|
|
24
|
+
}
|
|
25
|
+
export let kbdClass = '';
|
|
26
|
+
export let small = true;
|
|
27
|
+
if (small) {
|
|
28
|
+
kbdClass = twMerge(kbdClass, '!text-[10px] px-1', false && isMac() ? '!text-lg ' : 'text-xs', 'leading-none');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
kbdClass += ' !text-xs px-1.5';
|
|
32
|
+
}
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<div
|
|
36
|
+
{id}
|
|
37
|
+
on:click|stopPropagation={runAction}
|
|
38
|
+
on:mouseenter={() => dispatch('hover')}
|
|
39
|
+
class={`rounded-md w-full ${hovered ? 'bg-surface-hover' : ''}`}
|
|
40
|
+
>
|
|
41
|
+
{#if $$slots.itemReplacement}
|
|
42
|
+
<slot name="itemReplacement" />
|
|
43
|
+
{:else}
|
|
44
|
+
<div class="flex flex-row gap-2 items-center px-1 py-0.5 rounded-md pr-6 font-light">
|
|
45
|
+
<div class="w-4">
|
|
46
|
+
{#if icon}
|
|
47
|
+
<svelte:component this={icon} size={14} />
|
|
48
|
+
{:else if shortcutKey != undefined}
|
|
49
|
+
<div class="font-bold flex items-center justify-center w-full">
|
|
50
|
+
<span
|
|
51
|
+
class="h-4 center-center ml-0.5 rounded border bg-surface-secondary text-primary shadow-sm font-light transition-all group-hover:border-primary-500 group-hover:text-primary-inverse"
|
|
52
|
+
>
|
|
53
|
+
<kbd class={kbdClass}>
|
|
54
|
+
{shortcutKey}
|
|
55
|
+
</kbd>
|
|
56
|
+
</span>
|
|
57
|
+
</div>
|
|
58
|
+
{/if}
|
|
59
|
+
</div>
|
|
60
|
+
{label}
|
|
61
|
+
{#if shortcutKey != undefined}
|
|
62
|
+
<div class="ml-auto">
|
|
63
|
+
<div class="font-bold flex items-center justify-center w-full">
|
|
64
|
+
<span
|
|
65
|
+
class="flex h-4 center-center ml-0.5 rounded border bg-surface-secondary text-primary shadow-sm font-light transition-all group-hover:border-primary-500 group-hover:text-primary-inverse"
|
|
66
|
+
>
|
|
67
|
+
<kbd class={kbdClass}>
|
|
68
|
+
{shortcutKey}
|
|
69
|
+
</kbd>
|
|
70
|
+
</span>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
{/if}
|
|
74
|
+
</div>
|
|
75
|
+
{/if}
|
|
76
|
+
</div>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
hovered?: boolean | undefined;
|
|
5
|
+
id: string;
|
|
6
|
+
label?: string | undefined;
|
|
7
|
+
icon?: any;
|
|
8
|
+
shortcutKey?: string | undefined;
|
|
9
|
+
kbdClass?: string | undefined;
|
|
10
|
+
small?: boolean | undefined;
|
|
11
|
+
};
|
|
12
|
+
events: {
|
|
13
|
+
hover: CustomEvent<any>;
|
|
14
|
+
select: CustomEvent<any>;
|
|
15
|
+
} & {
|
|
16
|
+
[evt: string]: CustomEvent<any>;
|
|
17
|
+
};
|
|
18
|
+
slots: {
|
|
19
|
+
itemReplacement: {};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export type QuickMenuItemProps = typeof __propDef.props;
|
|
23
|
+
export type QuickMenuItemEvents = typeof __propDef.events;
|
|
24
|
+
export type QuickMenuItemSlots = typeof __propDef.slots;
|
|
25
|
+
export default class QuickMenuItem extends SvelteComponent<QuickMenuItemProps, QuickMenuItemEvents, QuickMenuItemSlots> {
|
|
26
|
+
}
|
|
27
|
+
export {};
|