windmill-components 1.22.0 → 1.28.2

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.
Files changed (252) hide show
  1. package/components/AppConnect.svelte +93 -47
  2. package/components/AppConnect.svelte.d.ts +2 -2
  3. package/components/ArgInfo.svelte +0 -5
  4. package/components/ArgInput.svelte +91 -64
  5. package/components/ArgInput.svelte.d.ts +8 -3
  6. package/components/Button.svelte +4 -4
  7. package/components/CenteredPage.svelte +1 -1
  8. package/components/CollapseLink.svelte +12 -0
  9. package/components/CollapseLink.svelte.d.ts +19 -0
  10. package/components/CronInput.svelte +84 -0
  11. package/components/CronInput.svelte.d.ts +18 -0
  12. package/components/DisplayResult.svelte +28 -15
  13. package/components/Editor.svelte +144 -61
  14. package/components/Editor.svelte.d.ts +2 -0
  15. package/components/EditorBar.svelte +215 -0
  16. package/components/EditorBar.svelte.d.ts +23 -0
  17. package/components/FlowBuilder.svelte +155 -79
  18. package/components/FlowEditor.svelte +75 -200
  19. package/components/FlowEditor.svelte.d.ts +3 -2
  20. package/components/FlowJobResult.svelte +1 -1
  21. package/components/FlowPreview.svelte +18 -24
  22. package/components/FlowPreviewContent.svelte +68 -0
  23. package/components/FlowPreviewContent.svelte.d.ts +21 -0
  24. package/components/FlowStatusViewer.svelte +85 -37
  25. package/components/FlowStatusViewer.svelte.d.ts +3 -2
  26. package/components/FlowViewer.svelte +98 -26
  27. package/components/FlowViewer.svelte.d.ts +2 -2
  28. package/components/IconedResourceType.svelte +30 -5
  29. package/components/InputTransformForm.svelte +209 -0
  30. package/components/InputTransformForm.svelte.d.ts +26 -0
  31. package/components/InputTransformsViewer.svelte +19 -0
  32. package/components/InputTransformsViewer.svelte.d.ts +17 -0
  33. package/components/InviteGlobalUser.svelte +2 -2
  34. package/components/InviteUser.svelte +2 -2
  35. package/components/JobStatus.svelte +32 -25
  36. package/components/Modal.svelte +44 -42
  37. package/components/ModuleStep.svelte +99 -76
  38. package/components/ObjectResourceInput.svelte +58 -38
  39. package/components/ObjectTypeNarrowing.svelte +4 -19
  40. package/components/Path.svelte +1 -1
  41. package/components/Path.svelte.d.ts +1 -1
  42. package/components/RadioButton.svelte +11 -96
  43. package/components/RadioButton.svelte.d.ts +4 -2
  44. package/components/ResourceEditor.svelte +4 -5
  45. package/components/ResourceEditor.svelte.d.ts +2 -2
  46. package/components/ResourcePicker.svelte +25 -2
  47. package/components/ResourcePicker.svelte.d.ts +3 -0
  48. package/components/ResourceTypePicker.svelte +17 -29
  49. package/components/ResourceTypePicker.svelte.d.ts +1 -0
  50. package/components/RunForm.svelte +14 -15
  51. package/components/RunForm.svelte.d.ts +1 -1
  52. package/components/SchemaEditor.svelte +87 -71
  53. package/components/SchemaEditor.svelte.d.ts +2 -0
  54. package/components/SchemaEditorProperty.svelte +11 -0
  55. package/components/SchemaEditorProperty.svelte.d.ts +17 -0
  56. package/components/SchemaForm.svelte +21 -127
  57. package/components/SchemaForm.svelte.d.ts +3 -4
  58. package/components/SchemaModal.svelte +20 -33
  59. package/components/SchemaModal.svelte.d.ts +1 -1
  60. package/components/SchemaViewer.svelte +5 -7
  61. package/components/ScriptBuilder.svelte +40 -43
  62. package/components/ScriptEditor.svelte +76 -248
  63. package/components/ScriptPicker.svelte +13 -26
  64. package/components/ScriptPicker.svelte.d.ts +1 -1
  65. package/components/ScriptSchema.svelte +0 -5
  66. package/components/ShareModal.svelte +1 -1
  67. package/components/SharedBadge.svelte +12 -10
  68. package/components/StringTypeNarrowing.svelte +8 -4
  69. package/components/StringTypeNarrowing.svelte.d.ts +1 -0
  70. package/components/TableCustom.svelte +7 -9
  71. package/components/TableSimple.svelte +1 -1
  72. package/components/Toggle.svelte +8 -10
  73. package/components/Toggle.svelte.d.ts +5 -11
  74. package/components/Tooltip.svelte +3 -2
  75. package/components/VariableEditor.svelte +21 -6
  76. package/components/flows/CopyFirstStepSchema.svelte +7 -5
  77. package/components/flows/DynamicInputHelpBox.svelte +1 -1
  78. package/components/flows/FlowBox.svelte +3 -0
  79. package/components/flows/FlowBox.svelte.d.ts +23 -0
  80. package/components/flows/FlowBoxHeader.svelte +9 -0
  81. package/components/flows/FlowBoxHeader.svelte.d.ts +18 -0
  82. package/components/flows/FlowInput.svelte +20 -0
  83. package/components/flows/FlowInput.svelte.d.ts +14 -0
  84. package/components/flows/FlowInputs.svelte +7 -3
  85. package/components/flows/FlowModuleHeader.svelte +44 -41
  86. package/components/flows/FlowModuleHeader.svelte.d.ts +1 -1
  87. package/components/flows/FlowSettings.svelte +174 -0
  88. package/components/flows/FlowSettings.svelte.d.ts +21 -0
  89. package/components/flows/flowStore.d.ts +5 -2
  90. package/components/flows/flowStore.js +65 -9
  91. package/components/flows/pickers/FlowScriptPicker.svelte +6 -1
  92. package/components/flows/pickers/FlowScriptPicker.svelte.d.ts +1 -0
  93. package/components/flows/utils.d.ts +11 -11
  94. package/components/flows/utils.js +111 -64
  95. package/components/icons/AirtableIcon.svelte +17 -0
  96. package/components/icons/AirtableIcon.svelte.d.ts +17 -0
  97. package/components/icons/GCloudIcon.svelte +16 -0
  98. package/components/icons/GCloudIcon.svelte.d.ts +17 -0
  99. package/components/icons/GItlabIcon.svelte +16 -0
  100. package/components/icons/GItlabIcon.svelte.d.ts +17 -0
  101. package/components/icons/GSheetsIcon.svelte +16 -0
  102. package/components/icons/GSheetsIcon.svelte.d.ts +17 -0
  103. package/components/icons/GcalIcon.svelte +16 -0
  104. package/components/icons/GcalIcon.svelte.d.ts +17 -0
  105. package/components/icons/GdriveIcon.svelte +16 -0
  106. package/components/icons/GdriveIcon.svelte.d.ts +17 -0
  107. package/components/icons/GmailIcon.svelte +16 -0
  108. package/components/icons/GmailIcon.svelte.d.ts +17 -0
  109. package/components/icons/PostgresIcon.svelte +8 -49
  110. package/components/icons/Slack.svelte +9 -18
  111. package/components/icons/TogglIcon.svelte +59 -0
  112. package/components/icons/TogglIcon.svelte.d.ts +17 -0
  113. package/components/propertyPicker/ObjectViewer.svelte +35 -37
  114. package/components/propertyPicker/ObjectViewer.svelte.d.ts +1 -0
  115. package/components/propertyPicker/OverlayPropertyPicker.svelte +53 -53
  116. package/components/propertyPicker/OverlayPropertyPicker.svelte.d.ts +5 -2
  117. package/components/propertyPicker/PropPicker.svelte +13 -15
  118. package/components/propertyPicker/PropPicker.svelte.d.ts +1 -1
  119. package/components/propertyPicker/WarningMessage.svelte +14 -41
  120. package/components/propertyPicker/WarningMessage.svelte.d.ts +11 -8
  121. package/components/propertyPicker/utils.d.ts +1 -0
  122. package/components/propertyPicker/utils.js +25 -0
  123. package/gen/core/OpenAPI.js +1 -1
  124. package/gen/index.d.ts +12 -2
  125. package/gen/index.js +1 -2
  126. package/gen/models/CompletedJob.d.ts +1 -1
  127. package/gen/models/Flow.d.ts +3 -13
  128. package/gen/models/FlowMetadata.d.ts +9 -0
  129. package/gen/models/FlowMetadata.js +4 -0
  130. package/gen/models/FlowModuleValue.d.ts +5 -22
  131. package/gen/models/FlowModuleValue.js +1 -15
  132. package/gen/models/ForloopFlow.d.ts +8 -0
  133. package/gen/models/ForloopFlow.js +4 -0
  134. package/gen/models/InputTransform.d.ts +3 -12
  135. package/gen/models/InputTransform.js +1 -8
  136. package/gen/models/JavascriptTransform.d.ts +4 -0
  137. package/gen/models/JavascriptTransform.js +4 -0
  138. package/gen/models/MainArgSignature.d.ts +1 -1
  139. package/gen/models/NewSchedule.d.ts +1 -0
  140. package/gen/models/OpenFlow.d.ts +7 -0
  141. package/gen/models/OpenFlow.js +4 -0
  142. package/gen/models/OpenFlowWPath.d.ts +4 -0
  143. package/gen/models/OpenFlowWPath.js +4 -0
  144. package/gen/models/PathFlow.d.ts +4 -0
  145. package/gen/models/PathFlow.js +4 -0
  146. package/gen/models/PathScript.d.ts +4 -0
  147. package/gen/models/PathScript.js +4 -0
  148. package/gen/models/RawScript.d.ts +12 -0
  149. package/gen/models/RawScript.js +11 -0
  150. package/gen/models/Schedule.d.ts +1 -1
  151. package/gen/models/StaticTransform.d.ts +4 -0
  152. package/gen/models/StaticTransform.js +4 -0
  153. package/gen/models/TokenResponse.d.ts +3 -3
  154. package/gen/models/Usage.d.ts +5 -0
  155. package/gen/models/Usage.js +4 -0
  156. package/gen/models/User.d.ts +2 -0
  157. package/gen/schemas/$AuditLog.d.ts +32 -0
  158. package/gen/schemas/$AuditLog.js +35 -0
  159. package/gen/schemas/$CompletedJob.d.ts +98 -0
  160. package/gen/schemas/$CompletedJob.js +103 -0
  161. package/gen/schemas/$ContextualVariable.d.ts +16 -0
  162. package/gen/schemas/$ContextualVariable.js +19 -0
  163. package/gen/schemas/$CreateResource.d.ts +22 -0
  164. package/gen/schemas/$CreateResource.js +25 -0
  165. package/gen/schemas/$CreateVariable.d.ts +26 -0
  166. package/gen/schemas/$CreateVariable.js +29 -0
  167. package/gen/schemas/$CreateWorkspace.d.ts +20 -0
  168. package/gen/schemas/$CreateWorkspace.js +23 -0
  169. package/gen/schemas/$EditResource.d.ts +13 -0
  170. package/gen/schemas/$EditResource.js +16 -0
  171. package/gen/schemas/$EditResourceType.d.ts +10 -0
  172. package/gen/schemas/$EditResourceType.js +13 -0
  173. package/gen/schemas/$EditSchedule.d.ts +20 -0
  174. package/gen/schemas/$EditSchedule.js +23 -0
  175. package/gen/schemas/$EditVariable.d.ts +16 -0
  176. package/gen/schemas/$EditVariable.js +19 -0
  177. package/gen/schemas/$EditWorkspaceUser.d.ts +7 -0
  178. package/gen/schemas/$EditWorkspaceUser.js +10 -0
  179. package/gen/schemas/$Flow.d.ts +23 -0
  180. package/gen/schemas/$Flow.js +26 -0
  181. package/gen/schemas/$FlowMetadata.d.ts +31 -0
  182. package/gen/schemas/$FlowMetadata.js +34 -0
  183. package/gen/schemas/$FlowPreview.d.ts +80 -0
  184. package/gen/schemas/$FlowPreview.js +83 -0
  185. package/gen/schemas/$GlobalUserInfo.d.ts +26 -0
  186. package/gen/schemas/$GlobalUserInfo.js +29 -0
  187. package/gen/schemas/$Group.d.ts +23 -0
  188. package/gen/schemas/$Group.js +26 -0
  189. package/gen/schemas/$Job.d.ts +17 -0
  190. package/gen/schemas/$Job.js +20 -0
  191. package/gen/schemas/$ListableVariable.d.ts +35 -0
  192. package/gen/schemas/$ListableVariable.js +38 -0
  193. package/gen/schemas/$Login.d.ts +12 -0
  194. package/gen/schemas/$Login.js +15 -0
  195. package/gen/schemas/$MainArgSignature.d.ts +50 -0
  196. package/gen/schemas/$MainArgSignature.js +53 -0
  197. package/gen/schemas/$NewSchedule.d.ts +30 -0
  198. package/gen/schemas/$NewSchedule.js +33 -0
  199. package/gen/schemas/$NewToken.d.ts +11 -0
  200. package/gen/schemas/$NewToken.js +14 -0
  201. package/gen/schemas/$NewUser.d.ts +16 -0
  202. package/gen/schemas/$NewUser.js +19 -0
  203. package/gen/schemas/$Preview.d.ts +19 -0
  204. package/gen/schemas/$Preview.js +22 -0
  205. package/gen/schemas/$QueuedJob.d.ts +139 -0
  206. package/gen/schemas/$QueuedJob.js +144 -0
  207. package/gen/schemas/$Resource.d.ts +31 -0
  208. package/gen/schemas/$Resource.js +34 -0
  209. package/gen/schemas/$ResourceType.d.ts +17 -0
  210. package/gen/schemas/$ResourceType.js +20 -0
  211. package/gen/schemas/$Schedule.d.ts +47 -0
  212. package/gen/schemas/$Schedule.js +50 -0
  213. package/gen/schemas/$Script.d.ts +77 -0
  214. package/gen/schemas/$Script.js +80 -0
  215. package/gen/schemas/$ScriptArgs.d.ts +6 -0
  216. package/gen/schemas/$ScriptArgs.js +9 -0
  217. package/gen/schemas/$SlackToken.d.ts +24 -0
  218. package/gen/schemas/$SlackToken.js +27 -0
  219. package/gen/schemas/$TokenResponse.d.ts +23 -0
  220. package/gen/schemas/$TokenResponse.js +26 -0
  221. package/gen/schemas/$TruncatedToken.d.ts +25 -0
  222. package/gen/schemas/$TruncatedToken.js +28 -0
  223. package/gen/schemas/$Usage.d.ts +13 -0
  224. package/gen/schemas/$Usage.js +16 -0
  225. package/gen/schemas/$User.d.ts +42 -0
  226. package/gen/schemas/$User.js +45 -0
  227. package/gen/schemas/$UserWorkspaceList.d.ts +28 -0
  228. package/gen/schemas/$UserWorkspaceList.js +31 -0
  229. package/gen/schemas/$WorkerPing.d.ts +31 -0
  230. package/gen/schemas/$WorkerPing.js +34 -0
  231. package/gen/schemas/$Workspace.d.ts +19 -0
  232. package/gen/schemas/$Workspace.js +22 -0
  233. package/gen/schemas/$WorkspaceInvite.d.ts +16 -0
  234. package/gen/schemas/$WorkspaceInvite.js +19 -0
  235. package/gen/services/FlowService.d.ts +30 -16
  236. package/gen/services/FlowService.js +25 -0
  237. package/gen/services/JobService.d.ts +1 -1
  238. package/gen/services/ScriptService.d.ts +13 -8
  239. package/gen/services/WorkspaceService.d.ts +1 -1
  240. package/gen/services/WorkspaceService.js +1 -1
  241. package/infer.js +8 -1
  242. package/package.json +88 -16
  243. package/script_helpers.d.ts +1 -1
  244. package/script_helpers.js +11 -13
  245. package/sql.d.ts +89 -0
  246. package/sql.js +817 -0
  247. package/stores.d.ts +1 -1
  248. package/stores.js +0 -6
  249. package/utils.d.ts +26 -6
  250. package/utils.js +94 -7
  251. package/components/RadioButtonV2.svelte +0 -33
  252. package/components/RadioButtonV2.svelte.d.ts +0 -20
@@ -3,38 +3,57 @@ const apiTokenApps = {
3
3
  airtable: {
4
4
  img: 'airtable_connect.png',
5
5
  instructions: 'Click on the top-right avatar -> Account -> Api'
6
+ },
7
+ discord_webhook: {
8
+ img: 'discord_webhook.png',
9
+ instructions: 'Server Settings -> Integration -> Webhooks',
10
+ key: 'webhook_url'
11
+ },
12
+ toggl: {
13
+ img: 'toggl_connect.png',
14
+ instructions: 'Go to https://track.toggl.com/profile -> API Token'
6
15
  }
7
16
  };
8
17
  </script>
9
18
 
10
- <script>import IconedResourceType from './IconedResourceType.svelte';
11
- import PageHeader from './PageHeader.svelte';
12
- import { workspaceStore, userStore, oauthStore } from '../stores';
19
+ <script>import { oauthStore, userStore, workspaceStore } from '../stores';
13
20
  import { faMinus, faPlus } from '@fortawesome/free-solid-svg-icons';
21
+ import IconedResourceType from './IconedResourceType.svelte';
22
+ import PageHeader from './PageHeader.svelte';
14
23
  import { OauthService, ResourceService, VariableService } from '../gen';
15
- import { createEventDispatcher, onMount } from 'svelte';
16
- import Modal from './Modal.svelte';
24
+ import { page } from '$app/stores';
25
+ import { sendUserToast, truncateRev } from '../utils';
26
+ import { createEventDispatcher } from 'svelte';
17
27
  import Icon from 'svelte-awesome';
18
- import Path from './Path.svelte';
28
+ import Modal from './Modal.svelte';
19
29
  import Password from './Password.svelte';
20
- import { sendUserToast, truncateRev } from '../utils';
30
+ import Path from './Path.svelte';
21
31
  let manual = false;
22
32
  let value = '';
23
33
  let valueToken;
24
34
  let connects = {};
25
35
  let connectsManual = [];
36
+ let key = 'token';
37
+ $: key = apiTokenApps[resource_type]?.key ?? 'token';
26
38
  let scopes = [];
39
+ let extra_params = [];
27
40
  let path;
28
41
  let modal;
29
42
  let resource_type = '';
30
43
  let step = 1;
31
44
  let no_back = false;
32
45
  let pathError = '';
33
- export function open() {
46
+ export async function open(rt) {
34
47
  step = 1;
35
48
  value = '';
36
- resource_type = '';
37
49
  no_back = false;
50
+ resource_type = rt ?? '';
51
+ await loadConnects();
52
+ const connect = connects[resource_type];
53
+ if (connect) {
54
+ scopes = connect.scopes;
55
+ extra_params = Object.entries(connect.extra_params ?? {});
56
+ }
38
57
  modal.openModal();
39
58
  }
40
59
  export function openFromOauth(rt) {
@@ -61,7 +80,12 @@ async function next() {
61
80
  step += 1;
62
81
  }
63
82
  else if (step == 1 && !manual) {
64
- window.location.href = `/api/oauth/connect/${resource_type}?scopes=${scopes.join('+')}`;
83
+ const url = new URL(`/api/oauth/connect/${resource_type}`, $page.url.origin);
84
+ url.searchParams.append('scopes', scopes.join('+'));
85
+ if (extra_params.length > 0) {
86
+ extra_params.forEach(([key, value]) => url.searchParams.append(key, value));
87
+ }
88
+ window.location.href = url.toString();
65
89
  }
66
90
  else {
67
91
  let exists = await VariableService.existsVariable({
@@ -79,7 +103,7 @@ async function next() {
79
103
  throw Error(`Resource at path ${path} already exists. Delete it or pick another path`);
80
104
  }
81
105
  let account = undefined;
82
- if (valueToken.refresh_token != undefined && valueToken.expires_in != undefined) {
106
+ if (valueToken?.refresh_token != undefined && valueToken?.expires_in != undefined) {
83
107
  account = Number(await OauthService.createAccount({
84
108
  workspace: $workspaceStore,
85
109
  requestBody: {
@@ -90,25 +114,28 @@ async function next() {
90
114
  }
91
115
  }));
92
116
  }
117
+ const description = `${manual ? 'Token' : 'OAuth token'} for ${resource_type}`;
93
118
  await VariableService.createVariable({
94
119
  workspace: $workspaceStore,
95
120
  requestBody: {
96
121
  path,
97
122
  value,
98
123
  is_secret: true,
99
- description: `OAuth token for ${resource_type}`,
100
- is_oauth: true,
124
+ description,
125
+ is_oauth: !manual,
101
126
  account: account
102
127
  }
103
128
  });
129
+ const resourceValue = {};
130
+ resourceValue[key] = `$var:${path}`;
104
131
  await ResourceService.createResource({
105
132
  workspace: $workspaceStore,
106
133
  requestBody: {
107
134
  resource_type,
108
135
  path,
109
- value: { token: `$var:${path}` },
110
- description: `OAuth token for ${resource_type}`,
111
- is_oauth: true
136
+ value: resourceValue,
137
+ description,
138
+ is_oauth: !manual
112
139
  }
113
140
  });
114
141
  dispatch('refresh');
@@ -122,14 +149,6 @@ async function back() {
122
149
  }
123
150
  }
124
151
  const dispatch = createEventDispatcher();
125
- $: {
126
- if ($workspaceStore) {
127
- loadResources();
128
- }
129
- }
130
- onMount(() => {
131
- loadConnects();
132
- });
133
152
  </script>
134
153
 
135
154
  <Modal
@@ -137,19 +156,35 @@ onMount(() => {
137
156
  on:close={() => {
138
157
  dispatch('close')
139
158
  }}
159
+ on:open={() => {
160
+ loadConnects()
161
+ loadResources()
162
+ }}
140
163
  >
141
- <div slot="title">Connect an app</div>
164
+ <div slot="title">Connect an App</div>
142
165
  <div slot="content">
143
166
  {#if step == 1}
167
+ {#if resource_type && !connects[resource_type] && !connectsManual.find((x) => x[0] == resource_type)}
168
+ <div class="bg-red-100 border-l-4 border-red-600 text-orange-700 p-4" role="alert">
169
+ <p class="font-bold">No app integration for {resource_type}</p>
170
+ <p>
171
+ The resource type "{resource_type}" seems to not have an app integration. You can still
172
+ create this resource manually by closing this modal and pressing: "Add a resource". You
173
+ can also contribute to windmill and add it as an app integration if relevant.
174
+ </p>
175
+ </div>
176
+ {/if}
144
177
  <PageHeader title="OAuth apps" />
145
178
  <div class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center mb-2">
146
- {#each Object.entries(connects) as [key, values]}
179
+ {#each Object.entries(connects).sort((a, b) => a[0].localeCompare(b[0])) as [key, values]}
147
180
  <button
148
181
  class="px-4 h-8 {key == resource_type ? 'item-button-selected' : 'item-button'}"
149
182
  on:click={() => {
150
183
  manual = false
151
184
  resource_type = key
152
- scopes = values
185
+ scopes = values.scopes
186
+ extra_params = Object.entries(values.extra_params ?? {})
187
+
153
188
  dispatch('click')
154
189
  }}
155
190
  >
@@ -175,11 +210,39 @@ onMount(() => {
175
210
  on:click={() => {
176
211
  scopes = scopes.concat('')
177
212
  }}>Add item &nbsp;<Icon data={faPlus} class="mb-1" /></button
178
- ><span class="ml-2">{(scopes ?? []).length} item(s)</span>
213
+ ><span class="ml-2">{(scopes ?? []).length} item{(scopes ?? []).length > 1 ? 's' : ''}</span
214
+ >
215
+ {:else}
216
+ <p class="italic text-sm">Pick an OAuth app and customize the scopes here</p>
217
+ {/if}
218
+ <PageHeader title="Extra Params" primary={false} />
219
+ {#if !manual && resource_type != ''}
220
+ {#each extra_params as [k, v], i}
221
+ <div class="flex flex-row max-w-md">
222
+ <input type="text" bind:value={k} />
223
+ <input type="text" bind:value={v} />
224
+
225
+ <button
226
+ class="default-button-secondary mx-6"
227
+ on:click={() => {
228
+ extra_params = extra_params.filter((el) => el[0] != k)
229
+ }}><Icon data={faMinus} class="mb-1" /></button
230
+ >
231
+ </div>
232
+ {/each}
233
+ <button
234
+ class="default-button-secondary mt-1"
235
+ on:click={() => {
236
+ extra_params.push(['', ''])
237
+ extra_params = extra_params
238
+ }}>Add item &nbsp;<Icon data={faPlus} class="mb-1" /></button
239
+ ><span class="ml-2"
240
+ >{(extra_params ?? []).length} item{(extra_params ?? []).length > 1 ? 's' : ''}</span
241
+ >
179
242
  {:else}
180
- <p class="italic text-sm">Pick an oauth app and customize the scopes here</p>
243
+ <p class="italic text-sm">Pick an OAuth app and customize the extra parameters here</p>
181
244
  {/if}
182
- <PageHeader title="API token apps" />
245
+ <PageHeader title="Non OAuth apps" />
183
246
  <div class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center mb-2">
184
247
  {#each connectsManual as [key, instructions]}
185
248
  <button
@@ -256,23 +319,6 @@ onMount(() => {
256
319
  </Modal>
257
320
 
258
321
  <style>
259
- .item-button {
260
- padding-top: 0.25rem;
261
- padding-bottom: 0.25rem;
262
- border-width: 1px;
263
- border-radius: 0.125rem
264
- }
265
- .item-button-selected {
266
- padding-top: 0.25rem;
267
- padding-bottom: 0.25rem;
268
- border-width: 1px;
269
- --tw-border-opacity: 1;
270
- border-color: rgb(59 130 246 / var(--tw-border-opacity));
271
- --tw-bg-opacity: 1;
272
- background-color: rgb(239 246 255 / var(--tw-bg-opacity));
273
- border-radius: 0.125rem
274
- }
275
-
276
322
  .selected:hover {
277
323
  border-radius: 0.375rem;
278
324
  border-width: 1px;
@@ -1,7 +1,7 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- open?: (() => void) | undefined;
4
+ open?: ((rt?: string) => Promise<void>) | undefined;
5
5
  openFromOauth?: ((rt: string) => void) | undefined;
6
6
  };
7
7
  events: {
@@ -16,7 +16,7 @@ export declare type AppConnectProps = typeof __propDef.props;
16
16
  export declare type AppConnectEvents = typeof __propDef.events;
17
17
  export declare type AppConnectSlots = typeof __propDef.slots;
18
18
  export default class AppConnect extends SvelteComponentTyped<AppConnectProps, AppConnectEvents, AppConnectSlots> {
19
- get open(): () => void;
19
+ get open(): (rt?: string | undefined) => Promise<void>;
20
20
  get openFromOauth(): (rt: string) => void;
21
21
  }
22
22
  export {};
@@ -2,7 +2,6 @@
2
2
  import Modal from './Modal.svelte';
3
3
  import Tooltip from './Tooltip.svelte';
4
4
  import json from 'svelte-highlight/languages/json';
5
- import github from 'svelte-highlight/styles/github';
6
5
  import { Highlight } from 'svelte-highlight';
7
6
  import { ResourceService } from '../gen';
8
7
  import { workspaceStore } from '../stores';
@@ -18,10 +17,6 @@ async function getResource(path) {
18
17
  let asJson = JSON.stringify(value, null, 4);
19
18
  </script>
20
19
 
21
- <svelte:head>
22
- {@html github}
23
- </svelte:head>
24
-
25
20
  <Modal bind:this={resourceViewer}>
26
21
  <div slot="title">{resource.path}</div>
27
22
  <div slot="content">
@@ -1,20 +1,21 @@
1
- <script>import Tooltip from './Tooltip.svelte';
2
- import { slide } from 'svelte/transition';
3
- import { faChevronDown, faChevronUp, faMinus, faPlus } from '@fortawesome/free-solid-svg-icons';
4
- import StringTypeNarrowing from './StringTypeNarrowing.svelte';
1
+ <script>import { slide } from 'svelte/transition';
2
+ import { faArrowRotateLeft, faChevronDown, faChevronUp, faMinus, faPlus } from '@fortawesome/free-solid-svg-icons';
3
+ import { setInputCat as computeInputCat } from '../utils';
4
+ import { Button, Tooltip } from 'flowbite-svelte';
5
+ import { createEventDispatcher } from 'svelte';
5
6
  import Icon from 'svelte-awesome';
6
- import ResourcePicker from './ResourcePicker.svelte';
7
- import ObjectTypeNarrowing from './ObjectTypeNarrowing.svelte';
8
- import ObjectResourceInput from './ObjectResourceInput.svelte';
7
+ import Editor from './Editor.svelte';
9
8
  import FieldHeader from './FieldHeader.svelte';
10
- import { createEventDispatcher } from 'svelte';
11
- import { setInputCat as computeInputCat } from '../utils';
9
+ import ObjectResourceInput from './ObjectResourceInput.svelte';
10
+ import ObjectTypeNarrowing from './ObjectTypeNarrowing.svelte';
11
+ import ResourcePicker from './ResourcePicker.svelte';
12
+ import StringTypeNarrowing from './StringTypeNarrowing.svelte';
12
13
  export let label = '';
13
14
  export let value;
14
15
  export let defaultValue = undefined;
15
16
  export let description = '';
16
17
  export let format = '';
17
- export let contentEncoding = '';
18
+ export let contentEncoding = undefined;
18
19
  export let type = undefined;
19
20
  export let required = false;
20
21
  export let pattern = undefined;
@@ -26,13 +27,13 @@ export let disabled = false;
26
27
  export let editableSchema = false;
27
28
  export let itemsType = undefined;
28
29
  export let displayHeader = true;
29
- export let numberAsString = false;
30
30
  let seeEditable = enum_ != undefined || pattern != undefined;
31
31
  const dispatch = createEventDispatcher();
32
32
  $: minHeight = `${1 + minRows * 1.2}em`;
33
33
  $: maxHeight = maxRows ? `${1 + maxRows * 1.2}em` : `auto`;
34
34
  $: validateInput(pattern, value);
35
35
  let error = '';
36
+ export let editor = undefined;
36
37
  let rawValue = undefined;
37
38
  $: {
38
39
  if (rawValue) {
@@ -107,7 +108,8 @@ $: {
107
108
  value = defaultValue;
108
109
  }
109
110
  }
110
- export let inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncoding);
111
+ export let inputCat = 'string';
112
+ $: inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncoding);
111
113
  </script>
112
114
 
113
115
  <div class="flex flex-col w-full">
@@ -122,20 +124,18 @@ export let inputCat = computeInputCat(type, format, itemsType?.type, enum_, cont
122
124
  on:click={() => {
123
125
  seeEditable = !seeEditable
124
126
  }}
125
- >Customize argument<Icon
126
- class="ml-2"
127
- data={seeEditable ? faChevronUp : faChevronDown}
128
- scale={0.7}
129
- /></span
130
127
  >
128
+ Customize argument
129
+ <Icon class="ml-2" data={seeEditable ? faChevronUp : faChevronDown} scale={0.7} />
130
+ </span>
131
131
 
132
132
  {#if seeEditable}
133
133
  <div transition:slide class="mt-2">
134
- <label class="text-gray-700"
135
- >Description
134
+ <label class="text-gray-700">
135
+ Description
136
136
  <textarea rows="1" bind:value={description} placeholder="Edit description" />
137
137
  {#if type == 'string' && !contentEncoding && format != 'date-time'}
138
- <StringTypeNarrowing bind:format bind:pattern bind:enum_ />
138
+ <StringTypeNarrowing bind:format bind:pattern bind:enum_ bind:contentEncoding />
139
139
  {:else if type == 'object'}
140
140
  <ObjectTypeNarrowing bind:format />
141
141
  {:else if type == 'array'}
@@ -163,8 +163,8 @@ export let inputCat = computeInputCat(type, format, itemsType?.type, enum_, cont
163
163
  {error === '' ? '...' : error}
164
164
  </div>
165
165
  </div>
166
- <div class="container">
167
- {#if inputCat == 'number' && !numberAsString}
166
+ <div class="flex space-x-1">
167
+ {#if inputCat == 'number'}
168
168
  <input
169
169
  {disabled}
170
170
  type="number"
@@ -188,40 +188,52 @@ export let inputCat = computeInputCat(type, format, itemsType?.type, enum_, cont
188
188
  <span>&nbsp; Not set</span>
189
189
  {/if}
190
190
  {:else if inputCat == 'list'}
191
- {#each value ?? [] as v}
192
- <div class="flex flex-row max-w-md">
193
- {#if itemsType?.type == 'number'}
194
- <input type="number" bind:value={v} />
195
- {:else if itemsType?.type == 'string' && itemsType?.contentEncoding == 'base64'}
196
- <input
197
- type="file"
198
- class="my-6"
199
- on:change={(x) => fileChanged(x, (val) => (v = val))}
200
- multiple={false}
201
- />
202
- {:else}
203
- <input type="text" bind:value={v} />
204
- {/if}
205
- <button
206
- class="default-button-secondary mx-6"
207
- on:click={() => {
208
- value = value.filter((el) => el != v)
209
- if (value.length == 0) {
210
- value = undefined
211
- }
212
- }}><Icon data={faMinus} class="mb-1" /></button
213
- >
191
+ <div>
192
+ <div>
193
+ {#each value ?? [] as v}
194
+ <div class="flex flex-row max-w-md mt-1">
195
+ {#if itemsType?.type == 'number'}
196
+ <input type="number" bind:value={v} />
197
+ {:else if itemsType?.type == 'string' && itemsType?.contentEncoding == 'base64'}
198
+ <input
199
+ type="file"
200
+ class="my-6"
201
+ on:change={(x) => fileChanged(x, (val) => (v = val))}
202
+ multiple={false}
203
+ />
204
+ {:else}
205
+ <input type="text" bind:value={v} />
206
+ {/if}
207
+ <button
208
+ class="default-button-secondary mx-6"
209
+ on:click={() => {
210
+ value = value.filter((el) => el != v)
211
+ if (value.length == 0) {
212
+ value = undefined
213
+ }
214
+ }}
215
+ >
216
+ <Icon data={faMinus} class="mb-1" />
217
+ </button>
218
+ </div>
219
+ {/each}
214
220
  </div>
215
- {/each}
216
- <button
217
- class="default-button-secondary mt-1"
218
- on:click={() => {
219
- if (value == undefined) {
220
- value = []
221
- }
222
- value = value.concat('')
223
- }}>Add item &nbsp;<Icon data={faPlus} class="mb-1" /></button
224
- ><span class="ml-2">{(value ?? []).length} item(s)</span>
221
+ <button
222
+ class="default-button-secondary mt-1"
223
+ on:click={() => {
224
+ if (value == undefined) {
225
+ value = []
226
+ }
227
+ value = value.concat('')
228
+ }}
229
+ >
230
+ <Icon data={faPlus} class="mr-2" />
231
+ Add item
232
+ </button>
233
+ <span class="ml-2">
234
+ {(value ?? []).length} item{(value ?? []).length > 1 ? 's' : ''}
235
+ </span>
236
+ </div>
225
237
  {:else if inputCat == 'resource-object'}
226
238
  <ObjectResourceInput {format} bind:value />
227
239
  {:else if inputCat == 'object'}
@@ -242,6 +254,17 @@ export let inputCat = computeInputCat(type, format, itemsType?.type, enum_, cont
242
254
  </select>
243
255
  {:else if inputCat == 'date'}
244
256
  <input class="inline-block" type="datetime-local" bind:value />
257
+ {:else if inputCat == 'sql'}
258
+ <div class="border rounded mb-4 w-full border-gray-700">
259
+ <Editor
260
+ on:focus={() => dispatch('focus')}
261
+ on:blur={() => dispatch('blur')}
262
+ bind:this={editor}
263
+ lang="sql"
264
+ bind:code={value}
265
+ class="two-lines-editor"
266
+ />
267
+ </div>
245
268
  {:else if inputCat == 'base64'}
246
269
  <input
247
270
  type="file"
@@ -258,6 +281,8 @@ export let inputCat = computeInputCat(type, format, itemsType?.type, enum_, cont
258
281
  />
259
282
  {:else if inputCat == 'string'}
260
283
  <textarea
284
+ on:focus={() => dispatch('focus')}
285
+ on:blur={() => dispatch('blur')}
261
286
  {disabled}
262
287
  style="height: {minHeight}; max-height: {maxHeight}"
263
288
  class="col-span-10 {valid
@@ -268,18 +293,20 @@ export let inputCat = computeInputCat(type, format, itemsType?.type, enum_, cont
268
293
  on:input={() => dispatch('input', { rawValue: value, isRaw: false })}
269
294
  />
270
295
  {/if}
271
- {#if !required}
272
- <div class="flex flex-row-reverse">
273
- <button
274
- {disabled}
275
- class="default-button-secondary items-center leading-4 py-0 my-px px-1 float-right"
296
+ {#if !required && inputCat != 'resource-object'}
297
+ <Tooltip placement="bottom" content="Reset to default value">
298
+ <Button
276
299
  on:click={() => (value = undefined)}
277
- >Reset<Tooltip>Reset to default value</Tooltip></button
300
+ {disabled}
301
+ color="alternative"
302
+ size="sm"
303
+ class="h-8"
278
304
  >
279
- </div>
305
+ <Icon data={faArrowRotateLeft} />
306
+ </Button>
307
+ </Tooltip>
280
308
  {/if}
309
+ <slot name="actions" />
281
310
  </div>
282
311
  </div>
283
312
  </div>
284
-
285
- <style></style>
@@ -1,5 +1,6 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  import { type InputCat } from '../utils';
3
+ import Editor from './Editor.svelte';
3
4
  declare const __propDef: {
4
5
  props: {
5
6
  label?: string | undefined;
@@ -7,7 +8,7 @@ declare const __propDef: {
7
8
  defaultValue?: any;
8
9
  description?: string | undefined;
9
10
  format?: string | undefined;
10
- contentEncoding?: string | undefined;
11
+ contentEncoding?: 'base64' | 'binary' | undefined;
11
12
  type?: string | undefined;
12
13
  required?: boolean | undefined;
13
14
  pattern?: undefined | string;
@@ -22,16 +23,20 @@ declare const __propDef: {
22
23
  contentEncoding?: "base64" | undefined;
23
24
  } | undefined;
24
25
  displayHeader?: boolean | undefined;
25
- numberAsString?: boolean | undefined;
26
+ editor?: Editor | undefined;
26
27
  evalValueToRaw?: (() => void) | undefined;
27
28
  inputCat?: InputCat | undefined;
28
29
  };
29
30
  events: {
30
31
  input: CustomEvent<any>;
32
+ focus: CustomEvent<any>;
33
+ blur: CustomEvent<any>;
31
34
  } & {
32
35
  [evt: string]: CustomEvent<any>;
33
36
  };
34
- slots: {};
37
+ slots: {
38
+ actions: {};
39
+ };
35
40
  };
36
41
  export declare type ArgInputProps = typeof __propDef.props;
37
42
  export declare type ArgInputEvents = typeof __propDef.events;
@@ -56,13 +56,13 @@ const dispatch = createEventDispatcher();
56
56
  .delete:hover,
57
57
  .archive:hover {
58
58
  --tw-bg-opacity: 1;
59
- background-color: rgb(220 38 38 / var(--tw-bg-opacity))
59
+ background-color: rgb(224 36 36 / var(--tw-bg-opacity))
60
60
  }
61
61
  .delete,
62
62
  .archive {
63
63
  font-weight: 400;
64
64
  --tw-text-opacity: 1;
65
- color: rgb(220 38 38 / var(--tw-text-opacity))
65
+ color: rgb(224 36 36 / var(--tw-text-opacity))
66
66
  }
67
67
  .delete:hover,
68
68
  .archive:hover {
@@ -73,7 +73,7 @@ const dispatch = createEventDispatcher();
73
73
  .archive {
74
74
  border-radius: 0.25rem;
75
75
  --tw-border-opacity: 1;
76
- border-color: rgb(220 38 38 / var(--tw-border-opacity))
76
+ border-color: rgb(224 36 36 / var(--tw-border-opacity))
77
77
  }
78
78
  .delete:hover,
79
79
  .archive:hover {
@@ -85,7 +85,7 @@ const dispatch = createEventDispatcher();
85
85
  .list:hover,
86
86
  .share:hover {
87
87
  --tw-bg-opacity: 1;
88
- background-color: rgb(59 130 246 / var(--tw-bg-opacity));
88
+ background-color: rgb(63 131 248 / var(--tw-bg-opacity));
89
89
  --tw-text-opacity: 1;
90
90
  color: rgb(255 255 255 / var(--tw-text-opacity))
91
91
  }</style>
@@ -1,5 +1,5 @@
1
1
  <div class="max-w-screen-lg flex grow w-full h-full xl:-ml-20">
2
- <div class="grow w-full h-full">
2
+ <div class="grow w-full h-full mt-4">
3
3
  <slot />
4
4
  </div>
5
5
  </div>
@@ -0,0 +1,12 @@
1
+ <script>import { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';
2
+ import Icon from 'svelte-awesome';
3
+ export let open = false;
4
+ export let text;
5
+ </script>
6
+
7
+ <button class="text-gray-600 underline" on:click={() => (open = !open)}>
8
+ {text}&nbsp;<Icon data={open ? faChevronUp : faChevronDown} scale={0.5} />
9
+ </button>
10
+ {#if open}
11
+ <div><slot /></div>
12
+ {/if}
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ open?: boolean | undefined;
5
+ text: string;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export declare type CollapseLinkProps = typeof __propDef.props;
15
+ export declare type CollapseLinkEvents = typeof __propDef.events;
16
+ export declare type CollapseLinkSlots = typeof __propDef.slots;
17
+ export default class CollapseLink extends SvelteComponentTyped<CollapseLinkProps, CollapseLinkEvents, CollapseLinkSlots> {
18
+ }
19
+ export {};