diff --git a/crates/app/src/assets.rs b/crates/app/src/assets.rs
index 6263118..a2f6b77 100644
--- a/crates/app/src/assets.rs
+++ b/crates/app/src/assets.rs
@@ -29,6 +29,7 @@ pub const ME_JS: &str = include_str!("./public/js/me.js");
// html
pub const ROOT: &str = include_str!("./public/html/root.html");
pub const MACROS: &str = include_str!("./public/html/macros.html");
+pub const COMPONENTS: &str = include_str!("./public/html/components.html");
pub const MISC_INDEX: &str = include_str!("./public/html/misc/index.html");
pub const MISC_ERROR: &str = include_str!("./public/html/misc/error.html");
@@ -41,6 +42,9 @@ pub const PROFILE_BASE: &str = include_str!("./public/html/profile/base.html");
pub const PROFILE_POSTS: &str = include_str!("./public/html/profile/posts.html");
pub const COMMUNITIES_LIST: &str = include_str!("./public/html/communities/list.html");
+pub const COMMUNITIES_BASE: &str = include_str!("./public/html/communities/base.html");
+pub const COMMUNITIES_FEED: &str = include_str!("./public/html/communities/feed.html");
+pub const COMMUNITIES_POST: &str = include_str!("./public/html/communities/post.html");
// langs
pub const LANG_EN_US: &str = include_str!("./langs/en-US.toml");
@@ -136,6 +140,7 @@ pub(crate) async fn write_assets(config: &Config) -> PathBufD {
write_template!(html_path->"root.html"(crate::assets::ROOT) --config=config);
write_template!(html_path->"macros.html"(crate::assets::MACROS) --config=config);
+ write_template!(html_path->"components.html"(crate::assets::COMPONENTS) --config=config);
write_template!(html_path->"misc/index.html"(crate::assets::MISC_INDEX) -d "misc" --config=config);
write_template!(html_path->"misc/error.html"(crate::assets::MISC_ERROR) --config=config);
@@ -148,6 +153,9 @@ pub(crate) async fn write_assets(config: &Config) -> PathBufD {
write_template!(html_path->"profile/posts.html"(crate::assets::PROFILE_POSTS) --config=config);
write_template!(html_path->"communities/list.html"(crate::assets::COMMUNITIES_LIST) -d "communities" --config=config);
+ write_template!(html_path->"communities/base.html"(crate::assets::COMMUNITIES_BASE) --config=config);
+ write_template!(html_path->"communities/feed.html"(crate::assets::COMMUNITIES_FEED) --config=config);
+ write_template!(html_path->"communities/post.html"(crate::assets::COMMUNITIES_POST) --config=config);
html_path
}
@@ -161,9 +169,15 @@ pub(crate) async fn init_dirs(config: &Config) {
create_dir_if_not_exists!(
&PathBufD::current().extend(&[config.dirs.media.as_str(), "avatars"])
);
+ create_dir_if_not_exists!(
+ &PathBufD::current().extend(&[config.dirs.media.as_str(), "community_avatars"])
+ );
create_dir_if_not_exists!(
&PathBufD::current().extend(&[config.dirs.media.as_str(), "banners"])
);
+ create_dir_if_not_exists!(
+ &PathBufD::current().extend(&[config.dirs.media.as_str(), "community_banners"])
+ );
write_if_track!(images_path->"default-avatar.svg"(DEFAULT_AVATAR) --config=config);
write_if_track!(images_path->"default-banner.svg"(DEFAULT_BANNER) --config=config);
@@ -191,6 +205,15 @@ pub(crate) async fn initial_context(
let mut ctx = Context::new();
ctx.insert("config", &config);
ctx.insert("user", &user);
+
+ if let Some(ua) = user {
+ ctx.insert("is_helper", &ua.permissions.check_helper());
+ ctx.insert("is_manager", &ua.permissions.check_manager());
+ } else {
+ ctx.insert("is_helper", &false);
+ ctx.insert("is_manager", &false);
+ }
+
ctx.insert("lang", &lang.data);
ctx.insert("random_cache_breaker", &CACHE_BREAKER.clone());
ctx
diff --git a/crates/app/src/langs/en-US.toml b/crates/app/src/langs/en-US.toml
index d34aee8..7c45d97 100644
--- a/crates/app/src/langs/en-US.toml
+++ b/crates/app/src/langs/en-US.toml
@@ -4,6 +4,7 @@ version = "1.0.0"
[data]
"general:link.home" = "Home"
"general:link.communities" = "Communities"
+"general:action.delete" = "Delete"
"dialog:action.okay" = "Ok"
"dialog:action.continue" = "Continue"
@@ -20,8 +21,18 @@ version = "1.0.0"
"auth:link.settings" = "Settings"
"auth:label.followers" = "Followers"
"auth:label.following" = "Following"
-"auth:label.joined_journals" = "Joined Journals"
+"auth:label.joined_communities" = "Joined communities"
+"auth:label.recent_posts" = "Recent posts"
"communities:action.create" = "Create"
"communities:label.create_new" = "Create new community"
"communities:label.name" = "Name"
+"communities:action.join" = "Join"
+"communities:action.leave" = "Leave"
+"communities:action.configure" = "Configure"
+"communities:label.create_post" = "Create post"
+"communities:label.content" = "Content"
+"communities:label.posts" = "Posts"
+"communities:label.create_reply" = "Create reply"
+"communities:label.replies" = "Replies"
+"communities:action.continue_thread" = "Continue thread"
diff --git a/crates/app/src/public/css/style.css b/crates/app/src/public/css/style.css
index 4420cff..647a7dd 100644
--- a/crates/app/src/public/css/style.css
+++ b/crates/app/src/public/css/style.css
@@ -78,11 +78,7 @@ body {
overflow-x: hidden;
}
-main,
-article,
-nav,
-header,
-footer {
+main {
width: 80ch;
margin: 0 auto;
padding: 0.75rem 1rem;
@@ -422,11 +418,16 @@ select {
transition: background 0.15s;
resize: vertical;
width: 100%;
+ font-family: inherit;
/* personality */
background: transparent;
color: inherit;
}
+textarea {
+ min-height: 5rem;
+}
+
input:focus,
textarea:focus,
select:focus {
@@ -1062,6 +1063,10 @@ details.accordion .inner {
}
@media screen and (max-width: 900px) {
+ .flex-collapse {
+ flex-direction: column !important;
+ }
+
.sm\:static {
position: static !important;
}
diff --git a/crates/app/src/public/html/communities/base.html b/crates/app/src/public/html/communities/base.html
new file mode 100644
index 0000000..765fd94
--- /dev/null
+++ b/crates/app/src/public/html/communities/base.html
@@ -0,0 +1,87 @@
+{% import "macros.html" as macros %} {% import "components.html" as components
+%} {% extends "root.html" %} {% block head %}
+
{{ community.context.display_name }} - {{ config.name }}
+{% endblock %} {% block body %} {{ macros::nav() }}
+
+
+
+
+
+
+ {{
+ components::community_avatar(id=community.id,size="72px")
+ }}
+
+
+
+ {% if community.context.display_name %}
+ {{ community.context.display_name }}
+ {% else %}
+ {{ community.username }}
+ {% endif %}
+
+
+ {{ community.title }}
+
+
+
+ {% if user %}
+
+ {% endif %}
+
+
+
+
+ {{ community.context.description }}
+
+
+
+
+ ID
+
+
+
+
+ Created
+ {{ community.created }}
+
+
+
+
+
+
{% block content %}{% endblock %}
+
+
+
+{% endblock %}
diff --git a/crates/app/src/public/html/communities/feed.html b/crates/app/src/public/html/communities/feed.html
new file mode 100644
index 0000000..9175ef5
--- /dev/null
+++ b/crates/app/src/public/html/communities/feed.html
@@ -0,0 +1,79 @@
+{% import "macros.html" as macros %} {% import "components.html" as components
+%} {% extends "communities/base.html" %} {% block content %}
+
+ {% if user %}
+
+
+ {{ text "communities:label.create_post" }}
+
+
+
+
+ {% endif %}
+
+
+
+ {{ icon "newspaper" }}
+ {{ text "communities:label.posts" }}
+
+
+
+
+ {% for post in feed %}
+ {{ components::post(post=post[0], owner=post[1], secondary=true, show_community=false) }}
+ {% endfor %}
+
+
+
+
+
+{% endblock %}
diff --git a/crates/app/src/public/html/communities/list.html b/crates/app/src/public/html/communities/list.html
index 9b04419..5c7c8e3 100644
--- a/crates/app/src/public/html/communities/list.html
+++ b/crates/app/src/public/html/communities/list.html
@@ -1,13 +1,18 @@
-{% import "macros.html" as macros %} {% extends "root.html" %} {% block head %}
+{% import "macros.html" as macros %} {% import "components.html" as components
+%} {% extends "root.html" %} {% block head %}
My communities - {{ config.name }}
{% endblock %} {% block body %} {{ macros::nav(selected="communities") }}
+ {% if user %}
-
+
{{ text "communities:label.create_new" }}
-