windmill-components 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/LICENSE +661 -0
  2. package/common.d.ts +29 -0
  3. package/components/ArgInfo.svelte +48 -0
  4. package/components/ArgInput.svelte +277 -0
  5. package/components/AutosizedTextarea.svelte +34 -0
  6. package/components/Badge.svelte +12 -0
  7. package/components/Button.svelte +82 -0
  8. package/components/ButtonAndDropdown.svelte +25 -0
  9. package/components/CenteredPage.svelte +5 -0
  10. package/components/ChevronButton.svelte +21 -0
  11. package/components/DisplayResult.svelte +101 -0
  12. package/components/Dropdown.svelte +108 -0
  13. package/components/Editor.svelte +370 -0
  14. package/components/FieldHeader.svelte +21 -0
  15. package/components/FlowBuilder.svelte +202 -0
  16. package/components/FlowEditor.svelte +95 -0
  17. package/components/FlowPreview.svelte +141 -0
  18. package/components/FlowStatusViewer.svelte +137 -0
  19. package/components/GroupModal.svelte +90 -0
  20. package/components/IconedResourceType.svelte +32 -0
  21. package/components/InviteGlobalUser.svelte +56 -0
  22. package/components/InviteUser.svelte +48 -0
  23. package/components/ItemPicker.svelte +58 -0
  24. package/components/JobStatus.svelte +38 -0
  25. package/components/Modal.svelte +94 -0
  26. package/components/ModuleStep.svelte +64 -0
  27. package/components/Multiselect.svelte +327 -0
  28. package/components/ObjectResourceInput.svelte +62 -0
  29. package/components/ObjectTypeNarrowing.svelte +25 -0
  30. package/components/PageHeader.svelte +29 -0
  31. package/components/Password.svelte +45 -0
  32. package/components/Path.svelte +129 -0
  33. package/components/RadioButton.svelte +117 -0
  34. package/components/Required.svelte +11 -0
  35. package/components/ResourceEditor.svelte +260 -0
  36. package/components/ResourcePicker.svelte +21 -0
  37. package/components/ResourceTypePicker.svelte +71 -0
  38. package/components/RunForm.svelte +127 -0
  39. package/components/SchemaEditor.svelte +221 -0
  40. package/components/SchemaForm.svelte +166 -0
  41. package/components/SchemaModal.svelte +160 -0
  42. package/components/SchemaViewer.svelte +76 -0
  43. package/components/ScriptBuilder.svelte +293 -0
  44. package/components/ScriptEditor.svelte +669 -0
  45. package/components/ScriptPicker.svelte +110 -0
  46. package/components/ScriptSchema.svelte +71 -0
  47. package/components/ShareModal.svelte +135 -0
  48. package/components/SharedBadge.svelte +54 -0
  49. package/components/StringTypeNarrowing.svelte +101 -0
  50. package/components/Switch.svelte +61 -0
  51. package/components/TableCustom.svelte +39 -0
  52. package/components/TableSimple.svelte +66 -0
  53. package/components/Tabs.svelte +21 -0
  54. package/components/Tooltip.svelte +93 -0
  55. package/components/VariableEditor.svelte +159 -0
  56. package/components/icons/DbIcon.svelte +12 -0
  57. package/components/icons/Mail.svelte +62 -0
  58. package/components/icons/Mysql.svelte +77 -0
  59. package/components/icons/PostgresIcon.svelte +57 -0
  60. package/components/icons/Slack.svelte +26 -0
  61. package/gen/core/ApiError.d.ts +8 -0
  62. package/gen/core/ApiRequestOptions.d.ts +13 -0
  63. package/gen/core/ApiResult.d.ts +7 -0
  64. package/gen/core/CancelablePromise.d.ts +26 -0
  65. package/gen/core/OpenAPI.d.ts +16 -0
  66. package/gen/core/request.d.ts +13 -0
  67. package/gen/index.d.ts +59 -0
  68. package/gen/models/AuditLog.d.ts +32 -0
  69. package/gen/models/CompletedJob.d.ts +48 -0
  70. package/gen/models/ContextualVariable.d.ts +5 -0
  71. package/gen/models/CreateResource.d.ts +6 -0
  72. package/gen/models/CreateVariable.d.ts +6 -0
  73. package/gen/models/CreateWorkspace.d.ts +6 -0
  74. package/gen/models/EditResource.d.ts +5 -0
  75. package/gen/models/EditResourceType.d.ts +4 -0
  76. package/gen/models/EditSchedule.d.ts +7 -0
  77. package/gen/models/EditVariable.d.ts +6 -0
  78. package/gen/models/EditWorkspaceUser.d.ts +3 -0
  79. package/gen/models/Flow.d.ts +13 -0
  80. package/gen/models/FlowModule.d.ts +6 -0
  81. package/gen/models/FlowModuleValue.d.ts +10 -0
  82. package/gen/models/FlowPreview.d.ts +7 -0
  83. package/gen/models/FlowStatus.d.ts +6 -0
  84. package/gen/models/FlowStatusModule.d.ts +15 -0
  85. package/gen/models/FlowValue.d.ts +5 -0
  86. package/gen/models/GlobalUserInfo.d.ts +14 -0
  87. package/gen/models/Group.d.ts +6 -0
  88. package/gen/models/InputTransform.d.ts +12 -0
  89. package/gen/models/Job.d.ts +11 -0
  90. package/gen/models/ListableVariable.d.ts +8 -0
  91. package/gen/models/Login.d.ts +4 -0
  92. package/gen/models/MainArgSignature.d.ts +14 -0
  93. package/gen/models/NewSchedule.d.ts +9 -0
  94. package/gen/models/NewToken.d.ts +4 -0
  95. package/gen/models/NewUser.d.ts +5 -0
  96. package/gen/models/Preview.d.ts +13 -0
  97. package/gen/models/QueuedJob.d.ts +47 -0
  98. package/gen/models/Resource.d.ts +8 -0
  99. package/gen/models/ResourceType.d.ts +6 -0
  100. package/gen/models/Schedule.d.ts +13 -0
  101. package/gen/models/Script.d.ts +29 -0
  102. package/gen/models/ScriptArgs.d.ts +1 -0
  103. package/gen/models/TruncatedToken.d.ts +7 -0
  104. package/gen/models/User.d.ts +10 -0
  105. package/gen/models/UserWorkspaceList.d.ts +8 -0
  106. package/gen/models/WorkerPing.d.ts +8 -0
  107. package/gen/models/Workspace.d.ts +6 -0
  108. package/gen/models/WorkspaceInvite.d.ts +5 -0
  109. package/gen/services/AdminService.d.ts +35 -0
  110. package/gen/services/AuditService.d.ts +37 -0
  111. package/gen/services/FlowService.d.ts +82 -0
  112. package/gen/services/GranularAclService.d.ts +42 -0
  113. package/gen/services/GroupService.d.ts +94 -0
  114. package/gen/services/JobService.d.ts +217 -0
  115. package/gen/services/ResourceService.d.ts +116 -0
  116. package/gen/services/ScheduleService.d.ts +73 -0
  117. package/gen/services/ScriptService.d.ts +165 -0
  118. package/gen/services/SettingsService.d.ts +15 -0
  119. package/gen/services/UserService.d.ts +211 -0
  120. package/gen/services/VariableService.d.ts +66 -0
  121. package/gen/services/WorkerService.d.ts +15 -0
  122. package/gen/services/WorkspaceService.d.ts +137 -0
  123. package/infer.d.ts +2 -0
  124. package/lib/components/ArgInfo.svelte.d.ts +16 -0
  125. package/lib/components/ArgInput.svelte.d.ts +37 -0
  126. package/lib/components/AutosizedTextarea.svelte.d.ts +19 -0
  127. package/lib/components/Badge.svelte.d.ts +20 -0
  128. package/lib/components/Button.svelte.d.ts +23 -0
  129. package/lib/components/ButtonAndDropdown.svelte.d.ts +23 -0
  130. package/lib/components/CenteredPage.svelte.d.ts +23 -0
  131. package/lib/components/ChevronButton.svelte.d.ts +19 -0
  132. package/lib/components/DisplayResult.svelte.d.ts +16 -0
  133. package/lib/components/Dropdown.svelte.d.ts +22 -0
  134. package/lib/components/Editor.svelte.d.ts +38 -0
  135. package/lib/components/FieldHeader.svelte.d.ts +23 -0
  136. package/lib/components/FlowBuilder.svelte.d.ts +18 -0
  137. package/lib/components/FlowEditor.svelte.d.ts +19 -0
  138. package/lib/components/FlowPreview.svelte.d.ts +21 -0
  139. package/lib/components/FlowStatusViewer.svelte.d.ts +18 -0
  140. package/lib/components/GroupModal.svelte.d.ts +17 -0
  141. package/lib/components/IconedResourceType.svelte.d.ts +19 -0
  142. package/lib/components/InviteGlobalUser.svelte.d.ts +19 -0
  143. package/lib/components/InviteUser.svelte.d.ts +19 -0
  144. package/lib/components/ItemPicker.svelte.d.ts +24 -0
  145. package/lib/components/JobStatus.svelte.d.ts +17 -0
  146. package/lib/components/Modal.svelte.d.ts +28 -0
  147. package/lib/components/ModuleStep.svelte.d.ts +26 -0
  148. package/lib/components/Multiselect.svelte.d.ts +33 -0
  149. package/lib/components/ObjectResourceInput.svelte.d.ts +17 -0
  150. package/lib/components/ObjectTypeNarrowing.svelte.d.ts +16 -0
  151. package/lib/components/PageHeader.svelte.d.ts +20 -0
  152. package/lib/components/Password.svelte.d.ts +18 -0
  153. package/lib/components/Path.svelte.d.ts +26 -0
  154. package/lib/components/RadioButton.svelte.d.ts +21 -0
  155. package/lib/components/Required.svelte.d.ts +17 -0
  156. package/lib/components/ResourceEditor.svelte.d.ts +22 -0
  157. package/lib/components/ResourcePicker.svelte.d.ts +17 -0
  158. package/lib/components/ResourceTypePicker.svelte.d.ts +19 -0
  159. package/lib/components/RunForm.svelte.d.ts +22 -0
  160. package/lib/components/SchemaEditor.svelte.d.ts +22 -0
  161. package/lib/components/SchemaForm.svelte.d.ts +23 -0
  162. package/lib/components/SchemaModal.svelte.d.ts +44 -0
  163. package/lib/components/SchemaViewer.svelte.d.ts +17 -0
  164. package/lib/components/ScriptBuilder.svelte.d.ts +20 -0
  165. package/lib/components/ScriptEditor.svelte.d.ts +28 -0
  166. package/lib/components/ScriptPicker.svelte.d.ts +21 -0
  167. package/lib/components/ScriptSchema.svelte.d.ts +22 -0
  168. package/lib/components/ShareModal.svelte.d.ts +21 -0
  169. package/lib/components/SharedBadge.svelte.d.ts +17 -0
  170. package/lib/components/StringTypeNarrowing.svelte.d.ts +18 -0
  171. package/lib/components/Switch.svelte.d.ts +31 -0
  172. package/lib/components/TableCustom.svelte.d.ts +25 -0
  173. package/lib/components/TableSimple.svelte.d.ts +24 -0
  174. package/lib/components/Tabs.svelte.d.ts +20 -0
  175. package/lib/components/Tooltip.svelte.d.ts +20 -0
  176. package/lib/components/VariableEditor.svelte.d.ts +21 -0
  177. package/lib/components/icons/DbIcon.svelte.d.ts +17 -0
  178. package/lib/components/icons/Mail.svelte.d.ts +17 -0
  179. package/lib/components/icons/Mysql.svelte.d.ts +17 -0
  180. package/lib/components/icons/PostgresIcon.svelte.d.ts +17 -0
  181. package/lib/components/icons/Slack.svelte.d.ts +17 -0
  182. package/package.json +110 -0
  183. package/stores.d.ts +19 -0
  184. package/utils.d.ts +60 -0
@@ -0,0 +1,110 @@
1
+ <script>import { sendUserToast } from '../../utils';
2
+ import { ScriptService, FlowService, Script } from '../../gen';
3
+ import Icon from 'svelte-awesome';
4
+ import { faSearch } from '@fortawesome/free-solid-svg-icons';
5
+ import { hubScripts, workspaceStore } from '../../stores';
6
+ import { createEventDispatcher } from 'svelte';
7
+ import ItemPicker from './ItemPicker.svelte';
8
+ import RadioButton from './RadioButton.svelte';
9
+ import Modal from './Modal.svelte';
10
+ import { Highlight } from 'svelte-highlight';
11
+ import { python, typescript } from 'svelte-highlight/languages';
12
+ import github from 'svelte-highlight/styles/github';
13
+ export let scriptPath = undefined;
14
+ export let allowFlow = false;
15
+ export let allowHub = false;
16
+ export let itemKind = allowHub ? 'hub' : 'script';
17
+ let items = [];
18
+ let itemPicker;
19
+ let modalViewer;
20
+ let code = '';
21
+ let lang;
22
+ let options = [['Script', 'script']];
23
+ allowHub && options.unshift(['Hub', 'hub']);
24
+ allowFlow && options.push(['Flow', 'flow']);
25
+ const dispatch = createEventDispatcher();
26
+ async function getScript() {
27
+ if (itemKind == 'hub') {
28
+ code = await ScriptService.getHubScriptContentByPath({ path: scriptPath });
29
+ lang = Script.language.DENO;
30
+ }
31
+ else {
32
+ const script = await ScriptService.getScriptByPath({
33
+ workspace: $workspaceStore,
34
+ path: scriptPath
35
+ });
36
+ code = script.content;
37
+ lang = script.language;
38
+ }
39
+ }
40
+ async function loadItems() {
41
+ try {
42
+ if (itemKind == 'flow') {
43
+ items = await FlowService.listFlows({ workspace: $workspaceStore });
44
+ }
45
+ else if (itemKind == 'script') {
46
+ items = await ScriptService.listScripts({ workspace: $workspaceStore });
47
+ }
48
+ else {
49
+ items = $hubScripts ?? [];
50
+ }
51
+ }
52
+ catch (err) {
53
+ sendUserToast(`Could not load items: ${err}`, true);
54
+ }
55
+ }
56
+ $: {
57
+ if ($workspaceStore) {
58
+ loadItems();
59
+ }
60
+ }
61
+ </script>
62
+
63
+ <svelte:head>
64
+ {@html github}
65
+ </svelte:head>
66
+
67
+ <ItemPicker
68
+ bind:this={itemPicker}
69
+ pickCallback={(path, _) => {
70
+ scriptPath = path
71
+ dispatch('select', { path: scriptPath })
72
+ }}
73
+ itemName={itemKind == 'flow' ? 'Flow' : 'Script'}
74
+ extraField="summary"
75
+ loadItems={async () => {
76
+ await loadItems()
77
+ return items
78
+ }}
79
+ />
80
+
81
+ <div class="flex flex-row items-center space-x-5">
82
+ {#if options.length > 1}
83
+ <RadioButton bind:value={itemKind} {options} />
84
+ {/if}
85
+
86
+ <input type="text" value={scriptPath ?? 'No path chosen yet'} disabled />
87
+ <button class="default-button text-gray-100" on:click={() => itemPicker.openModal()}
88
+ >Pick a {itemKind} path<Icon class="mx-4" data={faSearch} /></button
89
+ >
90
+ {#if scriptPath != undefined && scriptPath != ''}
91
+ <button
92
+ class="text-xs text-blue-500"
93
+ on:click={async () => {
94
+ await getScript()
95
+ modalViewer.openModal()
96
+ }}>show code</button
97
+ >
98
+ {/if}
99
+ </div>
100
+
101
+ <Modal bind:this={modalViewer}>
102
+ <div slot="title">Script {scriptPath}</div>
103
+ <div slot="content">
104
+ {#if lang == 'python3'}
105
+ <Highlight language={python} {code} />
106
+ {:else if lang == 'deno'}
107
+ <Highlight language={typescript} {code} />
108
+ {/if}
109
+ </div>
110
+ </Modal>
@@ -0,0 +1,71 @@
1
+ <script>import PageHeader from './PageHeader.svelte';
2
+ import SchemaForm from './SchemaForm.svelte';
3
+ import Tabs from './Tabs.svelte';
4
+ import Highlight from 'svelte-highlight';
5
+ import json from 'svelte-highlight/languages/json';
6
+ import github from 'svelte-highlight/styles/github';
7
+ import SvelteMarkdown from 'svelte-markdown';
8
+ export let schema;
9
+ export let summary;
10
+ export let description;
11
+ export let synchronizedHeader = true;
12
+ let tab = 'ui';
13
+ export function setSchema(newSchema) {
14
+ schema = newSchema;
15
+ }
16
+ </script>
17
+
18
+ <svelte:head>
19
+ {@html github}
20
+ </svelte:head>
21
+
22
+ <div class="w-full">
23
+ <PageHeader title="UI customisation" />
24
+ <Tabs
25
+ tabs={[
26
+ ['ui', 'UI'],
27
+ ['jsonschema', `Jsonschema`]
28
+ ]}
29
+ bind:tab
30
+ />
31
+
32
+ <div class="mt-8" />
33
+ {#if tab == 'ui'}
34
+ <div class="grid grid-cols-3 gap-2">
35
+ <div>
36
+ <h2 class="mb-1">Summary</h2>
37
+ <div class="mb-2 md:mb-3 text-sm">
38
+ <textarea bind:value={summary} placeholder="Edit summary" />
39
+ <div class="prose text-sm">
40
+ {summary != '' ? summary : 'No summary'}
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div class="col-span-2">
45
+ <h2 class="mb-1">Description</h2>
46
+ <div class="mb-2 md:mb-6">
47
+ <div class="prose text-sm">
48
+ <textarea bind:value={description} placeholder="Edit description" />
49
+ <div class="prose text-sm">
50
+ <SvelteMarkdown
51
+ source={description && description != '' ? description : 'No description'}
52
+ />
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ {#if synchronizedHeader}
59
+ <div class="bg-blue-100 border-l-4 border-blue-600 text-blue-700 p-4 m-4" role="alert">
60
+ <p class="font-bold">Synchronized with main signature</p>
61
+ <p>
62
+ Argument names, being required or not, and default values are derived from the main
63
+ signature of step 2 and cannot be edited directly. Change the main signature to edit them.
64
+ </p>
65
+ </div>
66
+ {/if}
67
+ <SchemaForm {schema} editableSchema={true} />
68
+ {:else}
69
+ <Highlight language={json} code={JSON.stringify(schema, null, 4)} />
70
+ {/if}
71
+ </div>
@@ -0,0 +1,135 @@
1
+ <script>import Modal from './Modal.svelte';
2
+ import TableCustom from './TableCustom.svelte';
3
+ import { GranularAclService } from '../../gen/services/GranularAclService';
4
+ import { sendUserToast } from '../../utils';
5
+ import { GroupService, UserService } from '../../gen';
6
+ import { createEventDispatcher } from 'svelte';
7
+ import AutoComplete from 'simple-svelte-autocomplete';
8
+ import { workspaceStore } from '../../stores';
9
+ const dispatch = createEventDispatcher();
10
+ export let kind;
11
+ export let path = '';
12
+ let ownerKind = 'user';
13
+ let owner = '';
14
+ let newOwner = '';
15
+ let write = false;
16
+ let acls = [];
17
+ let groups = [];
18
+ let usernames = [];
19
+ let modal;
20
+ $: newOwner = [ownerKind === 'group' ? 'g' : 'u', owner].join('/');
21
+ export async function openModal(newPath) {
22
+ if (newPath) {
23
+ path = newPath;
24
+ }
25
+ loadAcls();
26
+ loadGroups();
27
+ loadUsernames();
28
+ modal.openModal();
29
+ }
30
+ async function loadAcls() {
31
+ acls = Object.entries(await GranularAclService.getGranularAcls({ workspace: $workspaceStore, path, kind }));
32
+ }
33
+ async function loadGroups() {
34
+ groups = await GroupService.listGroupNames({ workspace: $workspaceStore });
35
+ }
36
+ async function loadUsernames() {
37
+ usernames = await UserService.listUsernames({ workspace: $workspaceStore });
38
+ }
39
+ async function deleteAcl(owner) {
40
+ try {
41
+ await GranularAclService.removeGranularAcls({
42
+ workspace: $workspaceStore,
43
+ path,
44
+ kind,
45
+ requestBody: { owner }
46
+ });
47
+ loadAcls();
48
+ dispatch('change');
49
+ }
50
+ catch (err) {
51
+ sendUserToast(err.toString(), true);
52
+ }
53
+ }
54
+ async function addAcl(owner, write) {
55
+ try {
56
+ await GranularAclService.addGranularAcls({
57
+ workspace: $workspaceStore,
58
+ path,
59
+ kind,
60
+ requestBody: { owner, write }
61
+ });
62
+ loadAcls();
63
+ dispatch('change');
64
+ }
65
+ catch (err) {
66
+ sendUserToast(err.toString(), true);
67
+ }
68
+ }
69
+ </script>
70
+
71
+ <Modal bind:this={modal}>
72
+ <div slot="title">Share {path}</div>
73
+
74
+ <div slot="content">
75
+ <div class="flex flex-row pb-0 mb-5 justify-between">
76
+ <label class="block">
77
+ <span class="text-gray-700 text-sm"> Owner Kind </span>
78
+
79
+ <select
80
+ class="block mt-2 w-20"
81
+ bind:value={ownerKind}
82
+ on:change={() => {
83
+ if (ownerKind === 'group') {
84
+ owner = 'all'
85
+ } else {
86
+ owner = ''
87
+ }
88
+ }}
89
+ >
90
+ <option>user</option>
91
+ <option>group</option>
92
+ </select>
93
+ </label>
94
+ <label class="block grow mx-2">
95
+ <span class="text-sm text-gray-700">Owner</span>
96
+ <div class="block mt-1">
97
+ <div class="static z-50">
98
+ <AutoComplete
99
+ items={ownerKind === 'user' ? usernames : groups}
100
+ bind:selectedItem={owner}
101
+ />
102
+ </div>
103
+ </div>
104
+ </label>
105
+ <label class="block">
106
+ <span class="text-sm text-gray-700">Editor</span>
107
+ <input class="block mt-4" type="checkbox" bind:checked={write} />
108
+ </label>
109
+ <button
110
+ class="text-xs default-button max-h-6 place-self-end ml-2"
111
+ on:click={() => addAcl(newOwner, write)}>Add permission</button
112
+ >
113
+ </div>
114
+ <TableCustom>
115
+ <tr slot="header-row">
116
+ <th>owner</th>
117
+ <th>has write permission</th>
118
+ <th />
119
+ </tr>
120
+ <tbody slot="body">
121
+ {#each acls as [owner, write]}
122
+ <tr>
123
+ <td>{owner}</td>
124
+ <td>{write}</td>
125
+ <td
126
+ ><button class="default-button-secondary" on:click={() => deleteAcl(owner)}
127
+ >Delete</button
128
+ ></td
129
+ >
130
+ </tr>
131
+ {/each}
132
+ </tbody>
133
+ </TableCustom>
134
+ </div>
135
+ </Modal>
@@ -0,0 +1,54 @@
1
+ <script>import { userStore } from '../../stores';
2
+ import Badge from './Badge.svelte';
3
+ export let extraPerms = {};
4
+ export let canWrite;
5
+ let kind = undefined;
6
+ let reason = '';
7
+ $: {
8
+ let username = $userStore?.username ?? '';
9
+ let pgroups = $userStore?.pgroups ?? [];
10
+ let pusername = `u/${username}`;
11
+ let extraPermsKeys = Object.keys(extraPerms);
12
+ if (pusername in extraPermsKeys) {
13
+ if (extraPerms[pusername]) {
14
+ kind = 'write';
15
+ }
16
+ else {
17
+ kind = 'read';
18
+ }
19
+ reason = 'This item was shared to you personally';
20
+ }
21
+ else {
22
+ let writeGroup = pgroups.find((x) => extraPermsKeys.includes(x) && extraPerms[x]);
23
+ if (pgroups.find((x) => x in extraPermsKeys && extraPerms[x])) {
24
+ kind = 'write';
25
+ reason = `This item was write shared to the group ${writeGroup} which you are a member of`;
26
+ }
27
+ else {
28
+ let readGroup = pgroups.find((x) => extraPermsKeys.includes(x) && extraPerms[x]);
29
+ if (pgroups.find((x) => extraPermsKeys.includes(x))) {
30
+ kind = 'read';
31
+ reason = `This item was read-only shared to the group ${readGroup} which you are a member of`;
32
+ }
33
+ else {
34
+ kind = undefined;
35
+ }
36
+ }
37
+ }
38
+ if (kind == 'read' && canWrite) {
39
+ kind = undefined;
40
+ }
41
+ if (kind == undefined && !canWrite) {
42
+ kind = 'read';
43
+ reason = '';
44
+ }
45
+ }
46
+ </script>
47
+
48
+ <span>
49
+ {#if kind == 'read'}
50
+ <Badge tooltip={reason}>shared to you (read-only)</Badge>
51
+ {:else if kind == 'write'}
52
+ <Badge tooltip={reason}>shared to you</Badge>
53
+ {/if}
54
+ </span>
@@ -0,0 +1,101 @@
1
+ <script>import RadioButton from './RadioButton.svelte';
2
+ import ResourceTypePicker from './ResourceTypePicker.svelte';
3
+ export let pattern;
4
+ export let enum_;
5
+ export let format;
6
+ let kind = 'none';
7
+ let patternStr = pattern ?? '';
8
+ let resource;
9
+ const FORMATS = [
10
+ 'email',
11
+ 'hostname',
12
+ 'uri',
13
+ 'uuid',
14
+ 'ipv4'
15
+ // 'time',
16
+ // 'date',
17
+ // 'duration',
18
+ // 'ipv6',
19
+ // 'jsonpointer'
20
+ ];
21
+ $: format =
22
+ kind == 'resource' ? (resource != undefined ? `resource-${resource}` : 'resource') : undefined;
23
+ $: pattern = patternStr == '' ? undefined : patternStr;
24
+ </script>
25
+
26
+ <RadioButton
27
+ label="Kind"
28
+ small={true}
29
+ options={[
30
+ ['None', 'none'],
31
+ ['Enum', 'enum'],
32
+ ['Resource Path', 'resource'],
33
+ ['Format', 'format'],
34
+ ['Pattern', 'pattern']
35
+ ]}
36
+ bind:value={kind}
37
+ />
38
+
39
+ {#if kind == 'pattern'}
40
+ <label class="mb-2 text-gray-700 text-xs"
41
+ >Pattern (Regex)
42
+ <div class="flex flex-row">
43
+ <input
44
+ type="text"
45
+ placeholder="^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"
46
+ bind:value={patternStr}
47
+ />
48
+ <button
49
+ class="default-button-secondary mx-2 mb-1"
50
+ on:click={() => {
51
+ patternStr = ''
52
+ }}>clear</button
53
+ >
54
+ </div>
55
+ </label>
56
+ {:else if kind == 'enum'}
57
+ <label class="mb-2 text-gray-700 text-xs"
58
+ >Enums
59
+ {#each enum_ ?? [] as e}
60
+ <div class="flex flex-row max-w-md">
61
+ <input type="text" bind:value={e} />
62
+ <button
63
+ class="default-button mx-6"
64
+ on:click={() => {
65
+ enum_ = (enum_ ?? []).filter((el) => el != e)
66
+ if (enum_.length == 0) {
67
+ enum_ = undefined
68
+ }
69
+ }}>-</button
70
+ >
71
+ </div>
72
+ {/each}
73
+ <div class="flex flex-row my-1">
74
+ <button
75
+ class="default-button"
76
+ on:click={() => {
77
+ if (enum_ == undefined) {
78
+ enum_ = []
79
+ }
80
+ enum_ = enum_.concat('')
81
+ }}>+</button
82
+ >
83
+ <button
84
+ class="default-button-secondary ml-2"
85
+ on:click={() => {
86
+ enum_ = undefined
87
+ }}>clear</button
88
+ >
89
+ </div>
90
+ </label>
91
+ {:else if kind == 'resource'}
92
+ <div class="mt-1" />
93
+ <ResourceTypePicker bind:value={resource} />
94
+ {:else if kind == 'format'}
95
+ <select class="mt-1" bind:value={format}>
96
+ <option value={undefined} />
97
+ {#each FORMATS as f}
98
+ <option value={f}>{f}</option>
99
+ {/each}
100
+ </select>
101
+ {/if}
@@ -0,0 +1,61 @@
1
+ <script>
2
+ export let checked = false
3
+ export let label = ''
4
+ export let horizontal = true // Determines if the switch and label are on a row or col
5
+ export let textFormat = 'text-base' // Tailwind CSS classes to format the text
6
+ </script>
7
+
8
+ <div class="flex {horizontal ? 'flex-row justify-between' : 'flex-col'} {$$props.class}">
9
+ <div class="my-auto {textFormat} mr-2">{label}</div>
10
+ <label class="switch my-auto">
11
+ <input type="checkbox" bind:checked />
12
+ <span class="slider" />
13
+ </label>
14
+ </div>
15
+
16
+ <style>
17
+ .switch {
18
+ position: relative;
19
+ display: inline-block;
20
+ width: 30px;
21
+ height: 17px;
22
+ }
23
+
24
+ .switch input {
25
+ opacity: 0;
26
+ width: 0;
27
+ height: 0;
28
+ }
29
+
30
+ .slider {
31
+ position: absolute;
32
+ cursor: pointer;
33
+ top: 0;
34
+ left: 0;
35
+ right: 0;
36
+ bottom: 0;
37
+ background-color: #ccc;
38
+ transition: 0.4s;
39
+ border-radius: 17px;
40
+ }
41
+
42
+ .slider:before {
43
+ position: absolute;
44
+ content: '';
45
+ height: 13px;
46
+ width: 13px;
47
+ left: 2px;
48
+ bottom: 2px;
49
+ background-color: white;
50
+ transition: 0.4s;
51
+ border-radius: 50%;
52
+ }
53
+
54
+ input:checked + .slider {
55
+ background-color: #2196f3;
56
+ box-shadow: 0 0 1px #2196f3;
57
+ }
58
+
59
+ input:checked + .slider:before {
60
+ transform: translateX(13px);
61
+ }</style>
@@ -0,0 +1,39 @@
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ export let paginated = false;
3
+ export let currentPage = 1;
4
+ export let showNext = true;
5
+ const dispatch = createEventDispatcher();
6
+ </script>
7
+
8
+ <!-- A custom table
9
+ - the first slot should be a <tr>, containing th elements
10
+ - the second slot should be a <tbody>, containing th elements
11
+ -->
12
+ <div class="flex flex-col {$$props.class} min-w-full">
13
+ <div class="inline-block min-w-full py-2 align-middle md:px-6 lg:px-8">
14
+ <table id="table-custom" class="min-w-full divide-y divide-gray-300 table-auto">
15
+ <thead>
16
+ <slot name="header-row" />
17
+ </thead>
18
+ <slot name="body" />
19
+ </table>
20
+ </div>
21
+ {#if paginated}
22
+ <div class="flex flex-row-reverse text-gray-500 mb-6">
23
+ <button
24
+ class="ml-2 drop-shadow-md {showNext ? 'visible' : 'invisible'}"
25
+ on:click={() => {
26
+ dispatch('next')
27
+ }}>Next</button
28
+ >
29
+ <button
30
+ class="mx-2 drop-shadow-md {currentPage === 1 ? 'hidden' : ''}"
31
+ on:click={() => {
32
+ dispatch('previous')
33
+ }}>Previous</button
34
+ >
35
+ </div>
36
+ {/if}
37
+ </div>
38
+
39
+ <style></style>
@@ -0,0 +1,66 @@
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ // A table suitable if you can pass data as a list of row objects
3
+ export let headers;
4
+ export let data; // Object containing the data
5
+ export let keys;
6
+ export let defaultText = 'No data to display';
7
+ export let paginated = false;
8
+ export let twTextSize = 'text-sm md:text-base';
9
+ const dispatch = createEventDispatcher();
10
+ </script>
11
+
12
+ <div class="mt-8 flex flex-col {$$props.class}">
13
+ <div class="inline-block min-w-full py-2 align-middle md:px-6 lg:px-8">
14
+ <table class="min-w-full divide-y divide-gray-300 table-auto">
15
+ <thead>
16
+ <tr class={twTextSize}>
17
+ {#if headers}
18
+ {#each headers as header, i}
19
+ <th
20
+ class="py-3.5 text-left text-sm font-semibold text-gray-900 capitalize {i == 0
21
+ ? 'sm:pl-6 md:pl-0 pl-4 pr-3'
22
+ : 'px-3 '}">{header}</th
23
+ >
24
+ {/each}
25
+ {/if}
26
+ </tr>
27
+ </thead>
28
+ <tbody class="divide-y divide-gray-200">
29
+ {#if data && keys && data.length > 0}
30
+ {#each data as row}
31
+ <tr>
32
+ {#each keys as key, i}
33
+ <td
34
+ class="py-4 text-sm text-gray-700 {i == 0
35
+ ? 'pl-4 pr-3 sm:pl-6 md:pl-0 font-semibold'
36
+ : 'px-3'} {twTextSize}"
37
+ >
38
+ {row[key] ?? ''}</td
39
+ >
40
+ {/each}
41
+ </tr>
42
+ {/each}
43
+ {:else if data}
44
+ <tr>{defaultText}</tr>
45
+ {:else}
46
+ <tr>Loading...</tr>
47
+ {/if}
48
+ </tbody>
49
+ </table>
50
+ </div>
51
+ </div>
52
+ {#if paginated}
53
+ <div class="flex flex-row-reverse text-gray-500">
54
+ <button
55
+ on:click={() => {
56
+ dispatch('next')
57
+ }}>Next</button
58
+ >
59
+ <button
60
+ class="mx-2"
61
+ on:click={() => {
62
+ dispatch('next')
63
+ }}>Previous</button
64
+ >
65
+ </div>
66
+ {/if}
@@ -0,0 +1,21 @@
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ export let tabs;
3
+ export let dflt = 0;
4
+ export let tab = tabs[dflt][0];
5
+ const dispatch = createEventDispatcher();
6
+ $: dispatch('update', tab);
7
+ </script>
8
+
9
+ <div class="flex flex-col sm:flex-row text-base">
10
+ {#each tabs as [t, label]}
11
+ <button
12
+ class=" py-1 px-6 block hover:text-blue-500 focus:outline-noneborder-gray-200
13
+ {t === tab ? 'text-gray-700 font-semibold underline' : 'text-gray-500'}"
14
+ on:click={() => {
15
+ tab = t
16
+ }}
17
+ >
18
+ {label}
19
+ </button>
20
+ {/each}
21
+ </div>