-
+
No Activity
diff --git a/src/components/TeamMemberDetails/TeamMemberEmptyPage.tsx b/src/components/TeamMemberDetails/TeamMemberEmptyPage.tsx
index b3537c34d..4de37f834 100644
--- a/src/components/TeamMemberDetails/TeamMemberEmptyPage.tsx
+++ b/src/components/TeamMemberDetails/TeamMemberEmptyPage.tsx
@@ -10,18 +10,11 @@ export function TeamMemberEmptyPage(props: TeamMemberEmptyPageProps) {
return (
-
+
No Progress
- Progress will appear here as they start tracking their{' '}
-
- Roadmaps
- {' '}
- progress.
+ Progress will appear here as they start tracking their roadmaps.
diff --git a/src/components/TeamMembers/InviteMemberPopup.tsx b/src/components/TeamMembers/InviteMemberPopup.tsx
index 4982661ce..eb37ad43f 100644
--- a/src/components/TeamMembers/InviteMemberPopup.tsx
+++ b/src/components/TeamMembers/InviteMemberPopup.tsx
@@ -7,10 +7,11 @@ import { type AllowedRoles, RoleDropdown } from '../CreateTeam/RoleDropdown';
type InviteMemberPopupProps = {
onInvited: () => void;
onClose: () => void;
+ teamId?: string;
};
export function InviteMemberPopup(props: InviteMemberPopupProps) {
- const { onClose, onInvited } = props;
+ const { onClose, onInvited, teamId: defaultTeamId } = props;
const popupBodyRef = useRef
(null);
const emailRef = useRef(null);
@@ -18,7 +19,7 @@ export function InviteMemberPopup(props: InviteMemberPopupProps) {
const [email, setEmail] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState('');
- const { teamId } = useTeamId();
+ const { teamId = defaultTeamId } = useTeamId();
useEffect(() => {
emailRef?.current?.focus();
@@ -31,7 +32,7 @@ export function InviteMemberPopup(props: InviteMemberPopupProps) {
const { response, error } = await httpPost(
`${import.meta.env.PUBLIC_API_URL}/v1-invite-member/${teamId}`,
- { email, role: selectedRole }
+ { email, role: selectedRole },
);
if (error || !response) {
@@ -92,7 +93,7 @@ export function InviteMemberPopup(props: InviteMemberPopupProps) {
)}
diff --git a/src/components/TeamRoadmapsList/TeamRoadmaps.tsx b/src/components/TeamRoadmapsList/TeamRoadmaps.tsx
index 8bd94389b..a33156a19 100644
--- a/src/components/TeamRoadmapsList/TeamRoadmaps.tsx
+++ b/src/components/TeamRoadmapsList/TeamRoadmaps.tsx
@@ -233,7 +233,7 @@ export function TeamRoadmaps() {
const addRoadmapModal = isAddingRoadmap && (
setIsAddingRoadmap(false)}
- teamResourceConfig={teamResources}
+ teamResourceConfig={teamResources.map((c) => c.resourceId)}
allRoadmaps={filteredAllRoadmaps.filter((r) => r.renderer === 'editor')}
teamId={teamId}
onRoadmapAdd={(roadmapId: string) => {
@@ -309,9 +309,9 @@ export function TeamRoadmaps() {
{createRoadmapModal}
{confirmationContentIdModal}
-
+
- No roadmaps
+ No roadmaps
{canManageCurrentTeam
? 'Add a roadmap to start tracking your team'
@@ -320,7 +320,7 @@ export function TeamRoadmaps() {
{canManageCurrentTeam && (
setIsPickingOptions(true)}
>
Add roadmap
diff --git a/src/data/projects/log-analyser.md b/src/data/projects/log-analyser.md
new file mode 100644
index 000000000..e91242195
--- /dev/null
+++ b/src/data/projects/log-analyser.md
@@ -0,0 +1,48 @@
+---
+title: 'Log Analysis Tool'
+description: 'Write a simple tool to analyze logs from the command line.'
+isNew: true
+sort: 3
+difficulty: 'beginner'
+nature: 'CLI'
+skills:
+ - 'linux'
+ - 'bash'
+ - 'shell scripting'
+seo:
+ title: 'Log Analysis Tool'
+ description: 'Build a simple CLI tool to analyze logs from the command line.'
+ keywords:
+ - 'log analysis tool'
+ - 'devops project idea'
+roadmapIds:
+ - 'devops'
+ - 'linux'
+---
+
+The goal of this project is to help you practice some basic shell scripting skills. You will write a simple tool to analyze logs from the command line.
+
+## Requirements
+
+Download the sample nginx access log file from [here](https://gist.githubusercontent.com/kamranahmedse/e66c3b9ea89a1a030d3b739eeeef22d0/raw/77fb3ac837a73c4f0206e78a236d885590b7ae35/nginx-access.log). The log file contains the following fields:
+
+- IP address
+- Date and time
+- Request method and path
+- Response status code
+- Response size
+- Referrer
+- User agent
+
+You are required to create a shell script that reads the log file and provides the following information:
+
+```text
+Top 5 IP addresses with the most requests:
+45.76.135.253 - 1000 requests
+142.93.143.8 - 600 requests
+178.128.94.113 - 50 requests
+43.224.43.187 - 30 requests
+178.128.94.113 - 20 requests
+
+
+```
diff --git a/src/pages/dashboard.astro b/src/pages/dashboard.astro
index 242e651a6..0d6752e46 100644
--- a/src/pages/dashboard.astro
+++ b/src/pages/dashboard.astro
@@ -19,6 +19,10 @@ const enrichedRoleRoadmaps = roleRoadmaps
title: frontmatter.briefTitle,
description: frontmatter.briefDescription,
relatedRoadmapIds: frontmatter.relatedRoadmaps,
+ renderer: frontmatter.renderer,
+ metadata: {
+ tags: frontmatter.tags,
+ },
};
});
const enrichedSkillRoadmaps = skillRoadmaps
@@ -33,6 +37,10 @@ const enrichedSkillRoadmaps = skillRoadmaps
frontmatter.briefTitle === 'Go' ? 'Go Roadmap' : frontmatter.briefTitle,
description: frontmatter.briefDescription,
relatedRoadmapIds: frontmatter.relatedRoadmaps,
+ renderer: frontmatter.renderer,
+ metadata: {
+ tags: frontmatter.tags,
+ },
};
});
diff --git a/src/pages/team/index.astro b/src/pages/team/index.astro
index 18c2b659e..18367de27 100644
--- a/src/pages/team/index.astro
+++ b/src/pages/team/index.astro
@@ -1,15 +1,68 @@
---
-import AccountSidebar from '../../components/AccountSidebar.astro';
-import { TeamsList } from '../../components/TeamsList';
-import AccountLayout from '../../layouts/AccountLayout.astro';
+import { DashboardPage } from '../../components/Dashboard/DashboardPage';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getAllBestPractices } from '../../lib/best-practice';
+import { getRoadmapsByTag } from '../../lib/roadmap';
+
+const roleRoadmaps = await getRoadmapsByTag('role-roadmap');
+const skillRoadmaps = await getRoadmapsByTag('skill-roadmap');
+const bestPractices = await getAllBestPractices();
+
+const enrichedRoleRoadmaps = roleRoadmaps
+ .filter((roadmapItem) => !roadmapItem.frontmatter.isHidden)
+ .map((roadmap) => {
+ const { frontmatter } = roadmap;
+
+ return {
+ id: roadmap.id,
+ url: `/${roadmap.id}`,
+ title: frontmatter.briefTitle,
+ description: frontmatter.briefDescription,
+ relatedRoadmapIds: frontmatter.relatedRoadmaps,
+ renderer: frontmatter.renderer,
+ metadata: {
+ tags: frontmatter.tags,
+ },
+ };
+ });
+const enrichedSkillRoadmaps = skillRoadmaps
+ .filter((roadmapItem) => !roadmapItem.frontmatter.isHidden)
+ .map((roadmap) => {
+ const { frontmatter } = roadmap;
+
+ return {
+ id: roadmap.id,
+ url: `/${roadmap.id}`,
+ title:
+ frontmatter.briefTitle === 'Go' ? 'Go Roadmap' : frontmatter.briefTitle,
+ description: frontmatter.briefDescription,
+ relatedRoadmapIds: frontmatter.relatedRoadmaps,
+ renderer: frontmatter.renderer,
+ metadata: {
+ tags: frontmatter.tags,
+ },
+ };
+ });
+
+const enrichedBestPractices = bestPractices.map((bestPractice) => {
+ const { frontmatter } = bestPractice;
+
+ return {
+ id: bestPractice.id,
+ url: `/best-practices/${bestPractice.id}`,
+ title: frontmatter.briefTitle,
+ description: frontmatter.briefDescription,
+ };
+});
---
-
-
-
-
-
+
+
+
+