diff --git a/.github/workflows/build-and-push.yaml b/.github/workflows/build-and-push.yaml
new file mode 100644
index 000000000..1e5823956
--- /dev/null
+++ b/.github/workflows/build-and-push.yaml
@@ -0,0 +1,57 @@
+name: Build and Push Docker Image
+
+on:
+ push:
+ branches:
+ - main
+ - dev
+ release:
+ types: [published]
+env:
+ REGISTRY: ghcr.io
+ IMAGE_NAME: ${{ github.repository }}
+
+jobs:
+ build-and-push:
+ runs-on: ubuntu-latest
+ # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
+ permissions:
+ contents: read
+ packages: write
+ steps:
+
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Extract metadata (tags, labels) for Docker
+ id: meta
+ uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+ tags: |
+ # minimal
+ type=pep440,pattern={{version}},value=${{ github.ref_name }},enable=${{ github.event_name == 'release' }}
+ # branch event
+ type=ref,event=branch
+ type=raw,value=latest,enable=${{ github.event_name == 'release' }}
+
+ - name: Build and Push Docker image
+ uses: docker/build-push-action@v4
+ with:
+ # build-args:
+ context: .
+ push: true
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
diff --git a/docusaurus.config.js b/docusaurus.config.js
index 73c7e54fc..b626322f7 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -368,7 +368,182 @@ module.exports = {
to: "/docs/2024?id=Zenysis%20Technologies",
},
]
- }
+ },
+ {
+ label: "2025",
+ position: "left",
+ to: "/docs/2025/",
+ items: [
+ {
+ label: "ADC karnal",
+ to: "/docs/2025?id=ADC%20karnal",
+ },
+ {
+ label: "ADC Mahendragarh",
+ to: "/docs/2025?id=ADC%20Mahendragarh",
+ },
+ {
+ label: "ADC Rohtak",
+ to: "/docs/2025?id=ADC%20Rohtak",
+ },
+ {
+ label: "Armman",
+ to: "/docs/2025?id=Armman",
+ },
+ {
+ label: "Avanti Fellows",
+ to: "/docs/2025?id=Avanti%20Fellows",
+ },
+ {
+ label: "Beckn Collective",
+ to: "/docs/2025?id=Beckn%20Collective",
+ },
+ {
+ label: "CMC Ambala",
+ to: "/docs/2025?id=CMC%20Ambala",
+ },
+ {
+ label: "Consul Democracy",
+ to: "/docs/2025?id=Consul%20Democracy",
+ },
+ {
+ label: "COSS",
+ to: "/docs/2025?id=COSS",
+ },
+ {
+ label: "Dhwani",
+ to: "/docs/2025?id=Dhwani",
+ },
+ {
+ label: "Education Initiative",
+ to: "/docs/2025?id=Education%20Initiative",
+ },
+ {
+ label: "Flywheel",
+ to: "/docs/2025?id=Flywheel",
+ },
+ {
+ label: "Haqdarshak",
+ to: "/docs/2025?id=Haqdarshak",
+ },
+ {
+ label: "iabsis",
+ to: "/docs/2025?id=iabsis",
+ },
+ {
+ label: "IDInsight",
+ to: "/docs/2025?id=IDInsight",
+ },
+ {
+ label: "IIIT-Delhi",
+ to: "/docs/2025?id=IIIT-Delhi",
+ },
+ {
+ label: "IIIT-H RCTS",
+ to: "/docs/2025?id=IIIT-H%20RCTS",
+ },
+ {
+ label: "Medic",
+ to: "/docs/2025?id=Medic",
+ },
+ {
+ label: "MedPlat",
+ to: "/docs/2025?id=MedPlat",
+ },
+ {
+ label: "Medtronic Labs",
+ to: "/docs/2025?id=Medtronic%20Labs",
+ },
+ {
+ label: "MeitY",
+ to: "/docs/2025?id=MeitY",
+ },
+ {
+ label: "Metabrainz",
+ to: "/docs/2025?id=Metabrainz",
+ },
+ {
+ label: "Mifos",
+ to: "/docs/2025?id=Mifos",
+ },
+ {
+ label: "Mojaloop Foundation",
+ to: "/docs/2025?id=Mojaloop%20Foundation",
+ },
+ {
+ label: "MOSIP",
+ to: "/docs/2025?id=MOSIP",
+ },
+ {
+ label: "National Urban Digital Mission",
+ to: "/docs/2025?id=National%20Urban%20Digital%20Mission",
+ },
+ {
+ label: "NHA",
+ to: "/docs/2025?id=NHA",
+ },
+ {
+ label: "NSUT in collaboration with C4GT, SEETA and AIC",
+ to: "/docs/2025?id=NSUT%20in%20collaboration%20with%20C4GT%2C%20SEETA%20and%20AIC",
+ },
+ {
+ label: "OpenIMIS",
+ to: "/docs/2025?id=OpenIMIS",
+ },
+ {
+ label: "OpenNyAI",
+ to: "/docs/2025?id=OpenNyAI",
+ },
+ {
+ label: "Piramal Swasthya Management and Research Institute",
+ to: "/docs/2025?id=Piramal%20Swasthya%20Management%20and%20Research%20Institute",
+ },
+ {
+ label: "PlanetRead",
+ to: "/docs/2025?id=PlanetRead",
+ },
+ {
+ label: "Pratham Books",
+ to: "/docs/2025?id=Pratham%20Books",
+ },
+ {
+ label: "Protean",
+ to: "/docs/2025?id=Protean",
+ },
+ {
+ label: "Samanvay Foundation",
+ to: "/docs/2025?id=Samanvay%20Foundation",
+ },
+ {
+ label: "Sampatti Card",
+ to: "/docs/2025?id=Sampatti%20Card",
+ },
+ {
+ label: "ShikshaLokam",
+ to: "/docs/2025?id=ShikshaLokam",
+ },
+ {
+ label: "Statwig",
+ to: "/docs/2025?id=Statwig",
+ },
+ {
+ label: "Sugar Labs",
+ to: "/docs/2025?id=Sugar%20Labs",
+ },
+ {
+ label: "Tattle",
+ to: "/docs/2025?id=Tattle",
+ },
+ {
+ label: "Tekdi",
+ to: "/docs/2025?id=Tekdi",
+ },
+ {
+ label: "The Apprentice Project",
+ to: "/docs/2025?id=The%20Apprentice%20Project",
+ },
+ ],
+ },
],
},
footer: {
diff --git a/src/components/C4gt2025Description.js b/src/components/C4gt2025Description.js
new file mode 100644
index 000000000..90a9e9985
--- /dev/null
+++ b/src/components/C4gt2025Description.js
@@ -0,0 +1,65 @@
+// src/components/C4GT2025Description.js
+
+import React from "react";
+
+function C4GT2025Description() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ C4GT Mentoring Program 2025 is shaping up to be an exciting summer coding program, building upon the success of previous years to foster a strong community focused on developing and contributing to global digital public goods.
+
+
+
+ An opportunity for college students and working
+ professionals in India to dive into the GovTech space in 2025.
+
+ Organized annually over 2 months (July-August)
+
+ A new set of diverse and challenging GovTech problem
+ statements will be presented for participants to tackle in 2025.
+
+
+ Shortlisted contributors will receive mentorship from
+ leading experts in the GovTech ecosystem.
+
+
+
We're thrilled to have you join us in 2025! 🚀
+
+
+
+
+
+
+ );
+}
+
+export default C4GT2025Description;
\ No newline at end of file
diff --git a/src/components/Sidebar.js b/src/components/Sidebar.js
index 4aef1c984..62273f5ef 100644
--- a/src/components/Sidebar.js
+++ b/src/components/Sidebar.js
@@ -1,3 +1,5 @@
+// src/components/Sidebar.js
+
import React from "react";
import { useHistory } from "react-router-dom";
@@ -8,7 +10,8 @@ function Sidebar({
setCurrentOrg,
currentIssue,
setCurrentIssue,
- setCurrentTab
+ setCurrentTab,
+ year, // Add year prop
}) {
const history = useHistory();
return (
@@ -17,16 +20,28 @@ function Sidebar({
{
const newUrl = `/docs/2024/`;
- history.push(newUrl);
- setCurrentTab("c4gt")
+ history.push(newUrl);
+ setCurrentTab("c4gt");
}}
>
C4GT'24
+
+ {
+ const newUrl = `/docs/2025/`;
+ history.push(newUrl);
+ setCurrentTab("c4gt");
+ }}
+ >
+ C4GT'25
+
+
{issueData == null ? (
<>>
) : (
@@ -34,19 +49,19 @@ function Sidebar({
return (
{
- const newUrl = `/docs/2024?id=${data?.org_name}`;
+ const newUrl = `/docs/${year}?id=${data?.org_name}`;
history.push(newUrl);
setCurrentOrg(() => data?.org_name);
setCurrentIssue(() => null);
}}
>
{data?.org_name}
@@ -56,7 +71,7 @@ function Sidebar({
className="clean-btn menu__caret"
>
- {currentOrg == data?.org_name ? (
+ {currentOrg === data?.org_name ? (
{
- const newUrl = `/docs/2024?id=${currentOrg}&issue=${d.id}`;
+ const newUrl = `/docs/${year}?id=${currentOrg}&issue=${d.id}`;
history.push(newUrl);
setCurrentIssue(() => d.id);
}}
@@ -102,4 +117,4 @@ function Sidebar({
);
}
-export default Sidebar;
+export default Sidebar;
\ No newline at end of file
diff --git a/src/pages/docs/2024/index.js b/src/pages/docs/2024/index.js
index 73171bbc1..3d0137ff5 100644
--- a/src/pages/docs/2024/index.js
+++ b/src/pages/docs/2024/index.js
@@ -17,8 +17,9 @@ function C4GT2024() {
const [currentIssue, setCurrentIssue] = useState(null);
const [issueData, setIssueData] = useState(null);
const [currentOrgData, setCurrentOrgData] = useState(null);
- const [currentTab,setCurrentTab] = useState(null)
+ const [currentTab, setCurrentTab] = useState(null);
const [error, setError] = useState(null);
+ const year = 2024; // Define year here
useEffect(() => {
setError(() => null);
@@ -27,20 +28,21 @@ function C4GT2024() {
const ifOrg = urlParams.get("id") ? urlParams.get("id") : null;
const ifIssue = urlParams.get("issue") ? urlParams.get("issue") : null;
const newUrl = ifIssue
- ? `/docs/2024?id=${ifOrg}&issue=${ifIssue}`
+ ? `/docs/${year}?id=${ifOrg}&issue=${ifIssue}`
: ifOrg
- ? `/docs/2024?id=${ifOrg}`
- : "/docs/2024/";
+ ? `/docs/${year}?id=${ifOrg}`
+ : `/docs/${year}/`;
history.push(newUrl);
if (ifIssue) setCurrentIssue(() => ifIssue);
else setCurrentIssue(null);
- if (ifOrg) {setCurrentOrg(() => ifOrg);
- setCurrentTab("org")
- }
- else {setCurrentOrg(null);
- setCurrentTab("c4gt")
+ if (ifOrg) {
+ setCurrentOrg(() => ifOrg);
+ setCurrentTab("org");
+ } else {
+ setCurrentOrg(null);
+ setCurrentTab("c4gt");
}
- fetch(`${API_BASE_URL}/issues`, {
+ fetch(`${API_BASE_URL}/issues?year=${year}`, {
method: "GET",
headers: {
"X-Secret-Key": API_AUTH_KEY,
@@ -89,11 +91,11 @@ function C4GT2024() {
});
return data;
});
- setCurrentTab("org")
+ setCurrentTab("org");
} else {
setCurrentOrg(null);
setCurrentOrgData(null);
- setCurrentTab("c4gt")
+ setCurrentTab("c4gt");
}
}, [location]);
@@ -114,16 +116,14 @@ function C4GT2024() {
setCurrentIssue={setCurrentIssue}
setCurrentOrg={setCurrentOrg}
setCurrentTab={setCurrentTab}
+ year={`${year}`} // Pass the year prop here
/>
- {currentTab==="c4gt" ? (
-
- ) : currentIssue != null ? (
-
+ {currentTab === "c4gt" ? (
+
+ ) : currentIssue != null ? (
+
) : currentOrg != null ? (
>
)}
-
@@ -144,4 +143,5 @@ function C4GT2024() {
>
);
}
-export default C4GT2024;
+
+export default C4GT2024;
\ No newline at end of file
diff --git a/src/pages/docs/2025/index.css b/src/pages/docs/2025/index.css
new file mode 100644
index 000000000..4e5f7f581
--- /dev/null
+++ b/src/pages/docs/2025/index.css
@@ -0,0 +1,113 @@
+.sidebar-container-2024{
+ display: none;
+}
+.sidebar-container{
+ width: 100%;
+ display: flex;
+}
+.main-container{
+display: flex;
+width: 100%;
+}
+.breadcrumbs-items{
+--ifm-breadcrumb-size-multiplier: 0.7 !important;
+background: #f5f6f7;
+margin-bottom: .4rem;
+}
+.table-container{
+max-height: calc(100vh - 5.75rem);
+overflow-y: auto;
+position: sticky;
+top: calc(4.75rem);
+}
+.right-side-table{
+display: flex;
+align-items: center;
+flex-direction: column;
+justify-content: center;
+padding-right: 0;
+gap: 8px;
+}
+.header-layout{
+width: 100%;
+display: flex;
+justify-content: space-between;
+gap: 28px;
+}
+.h2-font{
+font-size: 32px;
+}
+
+table tr:nth-child(2n){
+ background-color: #ffffff !important;
+}
+
+.fullwidth-table th{
+ background-color: #f5f6f7 !important;
+}
+.error{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width:100%;
+ height: 100vh;
+ flex-direction: column
+}
+.container-height{
+ min-height: 60vh;
+}
+.breadcrumbs-margin{
+ margin-bottom: .4rem;
+}
+
+
+@media screen and (max-width: 779px){
+.header-layout{
+ flex-direction: column;
+}
+}
+@media screen and (min-width: 997px) {
+.sidebar-container-2024{
+ display: block;
+ width: 300px;
+ margin-top: calc(-1* 3.75rem);
+ will-change: width;
+ clip-path: inset(0px);
+ border-right: 1px solid #dadde1;
+ transition: width 200ms ease;
+ }
+.sidebar-styles{
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ max-height: 100vh;
+ padding-top: 3.75rem;
+ position: sticky;
+ top: 0;
+ transition: opacity 50ms;
+ width: 300px;
+}
+.menu_styles{
+ flex-grow: 1;
+ padding: .5rem;
+}
+.main-container{
+ flex-grow: 1;
+ max-width: calc(100% - 300px);
+ height: 100%;
+}
+.width{
+ max-width: 75% !important;
+}
+.breadcrumbs-items{
+ --ifm-breadcrumb-size-multiplier: 0.8;
+}
+
+.right-side-table{
+padding-right: 0;
+}
+.fullwidth-table{
+ width: 100%;
+ display: table;
+}
+}
\ No newline at end of file
diff --git a/src/pages/docs/2025/index.js b/src/pages/docs/2025/index.js
new file mode 100644
index 000000000..4374a0f47
--- /dev/null
+++ b/src/pages/docs/2025/index.js
@@ -0,0 +1,149 @@
+// src/pages/docs/2025/index.js
+
+import React, { useEffect, useState } from "react";
+import Layout from "@theme/Layout";
+import "./index.css";
+import { useHistory, useLocation } from "react-router-dom";
+import useParseMarkdown from "../../../hooks/useParseMarkdown";
+import ErrorComponent from "../../../components/ErrorComponent";
+import Sidebar from "../../../components/Sidebar";
+import C4GT2025Description from "../../../components/C4gt2025Description";
+import OrgDescription from "../../../components/OrgDescription";
+import IssueDescription from "../../../components/IssueDescription";
+
+function C4GT2025() {
+ const location = useLocation();
+ const history = useHistory();
+ const { API_AUTH_KEY, API_BASE_URL } = useParseMarkdown();
+ const [currentOrg, setCurrentOrg] = useState(null);
+ const [currentIssue, setCurrentIssue] = useState(null);
+ const [issueData, setIssueData] = useState(null);
+ const [currentOrgData, setCurrentOrgData] = useState(null);
+ const [currentTab, setCurrentTab] = useState(null);
+ const [error, setError] = useState(null);
+ const year = 2025; // Define year variable
+
+ useEffect(() => {
+ setError(() => null);
+ const queryString = location.search;
+ const urlParams = new URLSearchParams(queryString);
+ const ifOrg = urlParams.get("id") ? urlParams.get("id") : null;
+ const ifIssue = urlParams.get("issue") ? urlParams.get("issue") : null;
+ const newUrl = ifIssue
+ ? `/docs/${year}?id=${ifOrg}&issue=${ifIssue}`
+ : ifOrg
+ ? `/docs/${year}?id=${ifOrg}`
+ : `/docs/${year}/`;
+ history.push(newUrl);
+ if (ifIssue) setCurrentIssue(() => ifIssue);
+ else setCurrentIssue(null);
+ if (ifOrg) {
+ setCurrentOrg(() => ifOrg);
+ setCurrentTab("org");
+ } else {
+ setCurrentOrg(null);
+ setCurrentTab("c4gt");
+ }
+ fetch(`${API_BASE_URL}/issues?year=${year}`, { // Modified API call
+ method: "GET",
+ headers: {
+ "X-Secret-Key": API_AUTH_KEY,
+ },
+ })
+ .then((response) => {
+ return response.json();
+ })
+ .then((data) => {
+ if (data?.message) {
+ throw new Error(`${data?.message}`);
+ } else if (data?.error) {
+ throw new Error(`${data?.error}`);
+ } else {
+ let issues = data?.issues;
+ setIssueData(() => issues);
+ if (ifOrg) {
+ setCurrentOrgData(() => {
+ let issue_data = issues?.filter((d, i) => {
+ if (d.org_name == ifOrg) return d.issues;
+ else return;
+ });
+ return issue_data;
+ });
+ } else setCurrentOrgData(null);
+ }
+ })
+ .catch((error) => {
+ setError(() => error);
+ });
+ }, []);
+
+ useEffect(() => {
+ const queryString = location.search;
+ const urlParams = new URLSearchParams(queryString);
+ const ifOrg = urlParams.get("id") ? urlParams.get("id") : null;
+ const ifIssue = urlParams.get("issue") ? urlParams.get("issue") : null;
+ if (ifIssue) setCurrentIssue(() => ifIssue);
+ else setCurrentIssue(null);
+ if (ifOrg) {
+ setCurrentOrg(() => ifOrg);
+ setCurrentOrgData(() => {
+ let data = issueData?.filter((d, i) => {
+ if (d.org_name == ifOrg) return d.issues;
+ else return;
+ });
+ return data;
+ });
+ setCurrentTab("org");
+ } else {
+ setCurrentOrg(null);
+ setCurrentOrgData(null);
+ setCurrentTab("c4gt");
+ }
+ }, [location]);
+
+ return (
+ <>
+ {error ? (
+
+ ) : (
+
+
+
+
+
+ {currentTab === "c4gt" ? (
+
+ ) : currentIssue != null ? (
+
+ ) : currentOrg != null ? (
+
+ ) : (
+ <>>
+ )}
+
+
+
+
+ )}
+ >
+ );
+}
+
+export default C4GT2025;
\ No newline at end of file