Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e97470c2f6 | ||
|
|
9f26203ed5 | ||
|
|
d6fdcd0bce |
Generated
+1
-1
@@ -2948,7 +2948,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "portal"
|
name = "portal"
|
||||||
version = "0.3.1"
|
version = "0.3.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "portal"
|
name = "portal"
|
||||||
version = "0.3.1"
|
version = "0.3.2"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|||||||
@@ -105,7 +105,10 @@ cargo release patch # or minor / major
|
|||||||
That bumps `Cargo.toml`, tags `v<version>`, and pushes; CI
|
That bumps `Cargo.toml`, tags `v<version>`, and pushes; CI
|
||||||
(`.gitea/workflows/publish.yml`) reacts to the tag, builds once, and
|
(`.gitea/workflows/publish.yml`) reacts to the tag, builds once, and
|
||||||
attaches `portal-v<version>.tar.gz` (`portal` + `question_lint` +
|
attaches `portal-v<version>.tar.gz` (`portal` + `question_lint` +
|
||||||
`site/`) to the Gitea release. Plain pushes to `main` only run the
|
`hash.txt` + `site/`) to the Gitea release. Pkg files are
|
||||||
|
content-hashed (`hash-files = true`; instances run with
|
||||||
|
`LEPTOS_HASH_FILES=true`), so a freshly served page can never pair a
|
||||||
|
stale cached bundle with new wasm. Plain pushes to `main` only run the
|
||||||
tests (`test.yml`) — nothing reaches production from this repo.
|
tests (`test.yml`) — nothing reaches production from this repo.
|
||||||
|
|
||||||
**Roll it out** (in a content repo): edit one line in that repo's
|
**Roll it out** (in a content repo): edit one line in that repo's
|
||||||
|
|||||||
+11
-1
@@ -900,6 +900,7 @@ fn AlternativeCard(
|
|||||||
alternative=alt_name.clone()
|
alternative=alt_name.clone()
|
||||||
feature_name=feature_name.clone()
|
feature_name=feature_name.clone()
|
||||||
transitions=spec.transitions.clone()
|
transitions=spec.transitions.clone()
|
||||||
|
empty=spec.empty.clone()
|
||||||
pending_transitions=pending_transitions
|
pending_transitions=pending_transitions
|
||||||
transition_batch=transition_batch
|
transition_batch=transition_batch
|
||||||
/>
|
/>
|
||||||
@@ -1219,6 +1220,7 @@ fn ResourceFeature(
|
|||||||
alternative: String,
|
alternative: String,
|
||||||
feature_name: String,
|
feature_name: String,
|
||||||
transitions: Vec<Transition>,
|
transitions: Vec<Transition>,
|
||||||
|
empty: Option<String>,
|
||||||
pending_transitions: RwSignal<std::collections::HashMap<(String, String), String>>,
|
pending_transitions: RwSignal<std::collections::HashMap<(String, String), String>>,
|
||||||
transition_batch: ServerAction<TransitionAnswers>,
|
transition_batch: ServerAction<TransitionAnswers>,
|
||||||
) -> impl IntoView {
|
) -> impl IntoView {
|
||||||
@@ -1252,6 +1254,7 @@ fn ResourceFeature(
|
|||||||
{move || {
|
{move || {
|
||||||
let feature_name = feature_name.clone();
|
let feature_name = feature_name.clone();
|
||||||
let transitions = transitions.clone();
|
let transitions = transitions.clone();
|
||||||
|
let empty = empty.clone().unwrap_or_else(|| "Nothing here yet.".to_string());
|
||||||
data.get()
|
data.get()
|
||||||
.map(|res| match res {
|
.map(|res| match res {
|
||||||
Ok(value) => {
|
Ok(value) => {
|
||||||
@@ -1259,6 +1262,7 @@ fn ResourceFeature(
|
|||||||
<ResourceValue
|
<ResourceValue
|
||||||
feature_name=feature_name
|
feature_name=feature_name
|
||||||
transitions=transitions
|
transitions=transitions
|
||||||
|
empty=empty
|
||||||
value=value
|
value=value
|
||||||
pending_transitions=pending_transitions
|
pending_transitions=pending_transitions
|
||||||
transition_batch=transition_batch
|
transition_batch=transition_batch
|
||||||
@@ -1285,10 +1289,16 @@ fn ResourceFeature(
|
|||||||
fn ResourceValue(
|
fn ResourceValue(
|
||||||
feature_name: String,
|
feature_name: String,
|
||||||
transitions: Vec<Transition>,
|
transitions: Vec<Transition>,
|
||||||
|
empty: String,
|
||||||
value: serde_json::Value,
|
value: serde_json::Value,
|
||||||
pending_transitions: RwSignal<std::collections::HashMap<(String, String), String>>,
|
pending_transitions: RwSignal<std::collections::HashMap<(String, String), String>>,
|
||||||
transition_batch: ServerAction<TransitionAnswers>,
|
transition_batch: ServerAction<TransitionAnswers>,
|
||||||
) -> impl IntoView {
|
) -> impl IntoView {
|
||||||
|
// A jq like `.[] | {...}` over an empty list yields no output at
|
||||||
|
// all - that arrives as null, and it's the same silence as [].
|
||||||
|
if value.is_null() {
|
||||||
|
return view! { <p class="resource-empty">{empty}</p> }.into_any();
|
||||||
|
}
|
||||||
if let serde_json::Value::Array(items) = &value {
|
if let serde_json::Value::Array(items) = &value {
|
||||||
if let Ok(answers) = serde_json::from_value::<Vec<Answer>>(value.clone()) {
|
if let Ok(answers) = serde_json::from_value::<Vec<Answer>>(value.clone()) {
|
||||||
let mut answers = answers;
|
let mut answers = answers;
|
||||||
@@ -1323,7 +1333,7 @@ fn ResourceValue(
|
|||||||
.into_any();
|
.into_any();
|
||||||
}
|
}
|
||||||
if items.is_empty() {
|
if items.is_empty() {
|
||||||
return view! { <p class="resource-empty">"Nothing here yet."</p> }.into_any();
|
return view! { <p class="resource-empty">{empty}</p> }.into_any();
|
||||||
}
|
}
|
||||||
// A list of plain objects (e.g. a jq-shaped GiteaStarred/Url
|
// A list of plain objects (e.g. a jq-shaped GiteaStarred/Url
|
||||||
// resource) - render as cards rather than dumping raw JSON.
|
// resource) - render as cards rather than dumping raw JSON.
|
||||||
|
|||||||
@@ -202,6 +202,12 @@ pub struct ResourceSpec {
|
|||||||
/// `.[] | {name, url: .html_url}`. `None` returns it as-is.
|
/// `.[] | {name, url: .html_url}`. `None` returns it as-is.
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub jq: Option<String>,
|
pub jq: Option<String>,
|
||||||
|
/// What to say when the resource yields nothing - an empty list,
|
||||||
|
/// or `null` (a `.[] | ...` jq over an empty list produces no
|
||||||
|
/// output at all). Defaults to "Nothing here yet."; content sets
|
||||||
|
/// it where the silence needs a voice ("Nothing released yet").
|
||||||
|
#[serde(default)]
|
||||||
|
pub empty: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Where a resource's live data comes from. `Kv` (a NATS KV bucket
|
/// Where a resource's live data comes from. `Kv` (a NATS KV bucket
|
||||||
|
|||||||
Reference in New Issue
Block a user