Skip to content

Commit 0e943cc

Browse files
committed
feat: improve example loading and add more examples
1 parent b40618d commit 0e943cc

File tree

8 files changed

+626
-34
lines changed

8 files changed

+626
-34
lines changed

src/client/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ const ExampleSelector: FC = () => {
336336

337337
<DropdownMenuPortal>
338338
<DropdownMenuContent>
339-
{examples.map(({ title, slug }) => {
339+
{Object.entries(examples).map(([ slug, title ]) => {
340340
const params = new URLSearchParams();
341341
params.append("example", slug);
342342

src/examples/repo.ts renamed to src/examples/code/attach-gpu.tf

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
export default `locals {
1+
2+
locals {
23
coder_git_repos = [
34
"coder/coder", "coder/code-server", "coder/weno", "coder/preview"
45
]
@@ -55,4 +56,4 @@ data "coder_parameter" "ml_framework" {
5556
# can be referenced during provisioning with:
5657
#
5758
# data.coder_parameter.ml_framework.value
58-
#`
59+
#
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
version = "2.5.3"
6+
}
7+
}
8+
}
9+
10+
data "coder_workspace_owner" "me" {}
11+
data "coder_workspace" "me" {}
12+
13+
14+
locals {
15+
roles = [for r in data.coder_workspace_owner.me.rbac_roles: r.name]
16+
isAdmin = contains(data.coder_workspace_owner.me.groups, "admin")
17+
}
18+
19+
20+
data "coder_parameter" "admin" {
21+
count = local.isAdmin ? 1 : 0
22+
name = "admin"
23+
display_name = "!! Administrator Only !!"
24+
description = <<EOM
25+
Welcome to your advanced settings!
26+
27+
EOM
28+
29+
type = "string"
30+
form_type = "input"
31+
default = "c2104aa19e17cd54287f8e0e770952fba194a4b32ff2ac891ffd900249873dbf"
32+
order = 10
33+
}
34+
35+
data "coder_parameter" "see_player" {
36+
name = "see_player"
37+
display_name = "See the player"
38+
type = "bool"
39+
form_type = "switch"
40+
default = false
41+
order = 2
42+
}
43+
44+
data "coder_parameter" "player" {
45+
count = data.coder_parameter.see_player.value ? 1 : 0
46+
name = "player"
47+
display_name = "Dynamic parameters knows who you are!"
48+
description = <<EOM
49+
### Dynamic parameters knows who you are!
50+
51+
| Username | |
52+
|-----------|---|
53+
| Full Name | ${data.coder_workspace_owner.me.full_name} |
54+
| Email | ${data.coder_workspace_owner.me.email} |
55+
| Groups | ${join(",", data.coder_workspace_owner.me.groups)} |
56+
| Roles | ${join(",", local.roles)} |
57+
58+
EOM
59+
60+
type = "string"
61+
form_type = "input"
62+
styling = jsonencode({
63+
"disabled":true
64+
})
65+
default = "You can disable input?!"
66+
order = 3
67+
68+
options {
69+
value = data.coder_workspace_owner.me.full_name
70+
name = data.coder_workspace_owner.me.full_name
71+
}
72+
}
73+
74+
locals {
75+
ides = {
76+
"developer": ["VSCode", "Goland", "Cursor"]
77+
"contractor": ["Code-Server"]
78+
"admin": ["VSCode", "Goland", "Cursor", "WireShark"]
79+
}
80+
}
81+
82+
data "coder_parameter" "multi-select" {
83+
name = "multi-select"
84+
display_name = "Select your Coding Tools"
85+
description = "Different user see different tooling options"
86+
type = "list(string)"
87+
form_type = "multi-select"
88+
order = 4
89+
90+
dynamic "option" {
91+
for_each = local.ides[data.coder_workspace_owner.me.groups[0]]
92+
content {
93+
name = option.value
94+
value = option.value
95+
}
96+
}
97+
}
98+

src/examples/code/connections.tf

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
version = "2.4.0-pre0"
6+
}
7+
}
8+
}
9+
10+
locals {
11+
# solution_list = [for _, words in local.solutions : words]
12+
word_bank = flatten([for _, words in local.solutions : words])
13+
14+
15+
used_words = setunion(
16+
[],
17+
jsondecode(data.coder_parameter.rows["yellow"].value),
18+
jsondecode(data.coder_parameter.rows["green"].value),
19+
jsondecode(data.coder_parameter.rows["blue"].value),
20+
jsondecode(data.coder_parameter.rows["purple"].value),
21+
)
22+
23+
available_words = setsubtract(toset(local.word_bank), toset(local.used_words))
24+
25+
26+
colors = toset(["yellow", "green", "blue", "purple"])
27+
28+
solved = length([for color in local.colors : module.checker[color].solved if module.checker[color].solved]) == 4
29+
}
30+
31+
32+
locals {
33+
unpadded_items = tolist(local.available_words)
34+
target_width = 3
35+
remainder = length(local.unpadded_items) % local.target_width
36+
padding_needed = local.remainder == 0 ? 0 : local.target_width - local.remainder
37+
items = concat(local.unpadded_items, slice(["", "", ""], 0, local.padding_needed))
38+
39+
# Split into rows of 3 items each
40+
rows = [
41+
for i in range(0, length(local.items), local.target_width) : slice(local.items, i, i + local.target_width)
42+
]
43+
44+
# Generate Markdown rows
45+
markdown_rows = [
46+
for row in local.rows : "| ${join(" | ", concat(row, slice(["", "", ""], 0, local.target_width - length(row))))} |"
47+
]
48+
markdown = join("\n", concat(
49+
["| | | |", "|--------|--------|--------|"],
50+
local.markdown_rows
51+
))
52+
}
53+
54+
55+
module "checker" {
56+
for_each = local.colors
57+
source = "./checker"
58+
solutions = local.solutions
59+
guess = jsondecode(coalesce(data.coder_parameter.rows[each.value].value, "[]"))
60+
}
61+
62+
data "coder_parameter" display {
63+
name = "display"
64+
display_name = local.solved ? "Congrats, you won! You may now hit the switch!" : <<EOM
65+
Remaining words are below, you cannot use this switch until you solve the puzzle!
66+
67+
EOM
68+
69+
description = local.solved ? "Hitting the switch enables workspace creation." : <<EOM
70+
71+
| | | |
72+
|--|--|--|
73+
74+
75+
${local.markdown}
76+
77+
EOM
78+
type = "bool"
79+
form_type = "switch"
80+
default = local.solved ? false : true
81+
# default = local.solved ? "" : "Keep guessing!"
82+
83+
styling = jsonencode({
84+
disabled = !local.solved
85+
})
86+
}
87+
88+
output "solved" {
89+
value = local.solved
90+
}
91+
92+
93+
data "coder_parameter" "rows" {
94+
for_each = local.colors
95+
name = each.value
96+
display_name = module.checker[each.value].title
97+
description = module.checker[each.value].description
98+
# name = "rows"
99+
type = "list(string)"
100+
form_type = "multi-select"
101+
styling = jsonencode({
102+
disabled = module.checker[each.value].solved
103+
})
104+
default = "[]"
105+
order = 11
106+
107+
dynamic "option" {
108+
# for_each = toset(local.word_bank)
109+
// Must include the options that are selected, otherwise they are not in
110+
// the option set.
111+
for_each = toset(concat(tolist(local.available_words), jsondecode(data.coder_parameter.rows[each.value].value)))
112+
content {
113+
name = option.value
114+
value = option.value
115+
}
116+
}
117+
118+
# validation {
119+
# error = "Hey! ${length(data.coder_parameter.rows[each.value].value)}"
120+
# invalid = true
121+
# }
122+
}
123+
124+
125+
126+
127+
locals {
128+
solutions = tomap ({
129+
// Yellow
130+
// head, main,
131+
"Different Types of Agents": ["Real Estate", "Secret", "AI", "Free"],
132+
// Green
133+
// java Swift Go Python
134+
"Synoynms for Programming Languages": ["Coffee", "Fast", "Move", "Snake"],
135+
// Blue
136+
"Ending in Pool": ["Thread", "Talent", "Dead", "Whirl"],
137+
// Purple
138+
"Git Version Control": ["Remote", "Main", "Clone", "Checkout"],
139+
})
140+
}

0 commit comments

Comments
 (0)