2022-06-08 23:24:19 +03:00
|
|
|
|
import { PageLayout } from "../comp/page_layout.ts";
|
|
|
|
|
import { AnyNode, E } from "ren/node.ts";
|
|
|
|
|
import { classNames } from "ren/attrs.ts";
|
|
|
|
|
import { Context } from "../../context.ts";
|
|
|
|
|
import { H3 } from "../uikit/typo.ts";
|
2022-06-22 00:35:55 +03:00
|
|
|
|
import { Link, RepoLink } from "../uikit/link.ts";
|
2022-06-08 23:24:19 +03:00
|
|
|
|
|
2022-06-22 00:35:55 +03:00
|
|
|
|
const tr = E.bind(null, "tr", []);
|
|
|
|
|
const td = E.bind(null, "td", []);
|
|
|
|
|
const th = E.bind(null, "th", []);
|
2022-06-08 23:24:19 +03:00
|
|
|
|
|
2022-07-04 00:15:23 +03:00
|
|
|
|
export function WorksPage(ctx: Context, content: AnyNode): AnyNode {
|
2022-06-08 23:24:19 +03:00
|
|
|
|
return PageLayout(ctx, [
|
|
|
|
|
E("div", classNames("content-width gap-v-1x5 responsive-typography"), [
|
2022-07-04 00:15:23 +03:00
|
|
|
|
content,
|
2022-06-22 00:35:55 +03:00
|
|
|
|
H3(ctx.tr.Chronological),
|
2022-07-04 00:15:23 +03:00
|
|
|
|
ChronologicalWorksTable(ctx, CHRONOLOGICAL_WORKS),
|
2022-06-08 23:24:19 +03:00
|
|
|
|
]),
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-04 00:15:23 +03:00
|
|
|
|
function ChronologicalWorksTable(ctx: Context, works: Work[]): AnyNode {
|
2022-06-22 11:07:47 +03:00
|
|
|
|
return E("table", [], [
|
|
|
|
|
E("thead", [], [
|
|
|
|
|
tr([
|
2022-07-04 00:15:23 +03:00
|
|
|
|
th(ctx.tr.Name),
|
|
|
|
|
th(ctx.tr.Description),
|
|
|
|
|
th(ctx.tr.Role),
|
|
|
|
|
th(ctx.tr.Technologies),
|
|
|
|
|
th(ctx.tr.Start),
|
|
|
|
|
th(ctx.tr.Status_or_End),
|
2022-06-22 11:07:47 +03:00
|
|
|
|
]),
|
|
|
|
|
]),
|
|
|
|
|
E(
|
|
|
|
|
"tbody",
|
|
|
|
|
[],
|
|
|
|
|
works.map((work) => {
|
|
|
|
|
return tr([
|
|
|
|
|
td([work.name]),
|
|
|
|
|
td(work.description),
|
|
|
|
|
td(work.roles.join(", ")),
|
|
|
|
|
td(work.technologies.join(", ")),
|
2022-07-04 00:15:23 +03:00
|
|
|
|
td(work.startDate),
|
|
|
|
|
td(work.endDate ? work.endDate : (work.statuses ?? []).join(", ")),
|
2022-06-22 11:07:47 +03:00
|
|
|
|
]);
|
|
|
|
|
}),
|
|
|
|
|
),
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface Work {
|
|
|
|
|
name: AnyNode;
|
|
|
|
|
description: string;
|
|
|
|
|
roles: Role[];
|
|
|
|
|
technologies: Technology[];
|
2022-07-03 16:18:43 +03:00
|
|
|
|
// TODO: use Date instead of string
|
|
|
|
|
startDate: string;
|
|
|
|
|
endDate?: string;
|
2022-07-04 00:15:23 +03:00
|
|
|
|
statuses?: Status[];
|
2022-06-22 11:07:47 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum Role {
|
2022-07-22 13:53:25 +03:00
|
|
|
|
Collaborator = "collaborator",
|
2022-06-22 11:07:47 +03:00
|
|
|
|
Author = "author",
|
|
|
|
|
TechLead = "tech lead",
|
2022-07-03 16:18:43 +03:00
|
|
|
|
TeamLead = "team lead",
|
|
|
|
|
Developer = "developer",
|
2022-06-22 11:07:47 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum Technology {
|
|
|
|
|
JavaScript = "JS",
|
|
|
|
|
TypeScript = "TS",
|
|
|
|
|
Rust = "Rust",
|
|
|
|
|
Python = "Python",
|
|
|
|
|
Php = "PHP",
|
|
|
|
|
Deno = "Deno",
|
|
|
|
|
NodeJS = "NodeJS",
|
|
|
|
|
Flask = "Flask",
|
|
|
|
|
React = "React",
|
2022-07-03 16:18:43 +03:00
|
|
|
|
Antd = "Antd",
|
2022-06-22 12:12:06 +03:00
|
|
|
|
Postgresql = "PostgreSQL",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
Docker = "Docker",
|
|
|
|
|
Drone = "Drone",
|
2022-06-22 11:07:47 +03:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-22 00:35:55 +03:00
|
|
|
|
enum Status {
|
|
|
|
|
// New features are being added and bugs are being fixed.
|
|
|
|
|
ActiveDeveloped = "actively-developed",
|
|
|
|
|
|
|
|
|
|
// There are no plans for new features, but the maintainer intends to respond
|
|
|
|
|
// to issues that get filed.
|
|
|
|
|
PassivelyMaintained = "passively-maintained",
|
|
|
|
|
|
|
|
|
|
// The package is feature complete, the maintainer does not intend to continue
|
|
|
|
|
// working on it or providing support, but it works for the purposes it was
|
|
|
|
|
// designed for.
|
|
|
|
|
AsIs = "as-is",
|
|
|
|
|
|
|
|
|
|
// The author wants to share it with the community but is not intending to
|
|
|
|
|
// meet anyone's particular use case.
|
|
|
|
|
Experimental = "experimental",
|
|
|
|
|
|
|
|
|
|
// The current maintainer would like to transfer the package to someone else.
|
|
|
|
|
LookingForMaintainer = "looking-for-maintainer",
|
|
|
|
|
|
|
|
|
|
// The maintainer does not recommend using this package (the description of the
|
|
|
|
|
// package can describe why, there could be a better solution available or
|
|
|
|
|
// there could be problems with the package that the author does not want to fix).
|
|
|
|
|
Deprecated = "deprecated",
|
2022-06-08 23:24:19 +03:00
|
|
|
|
}
|
2022-07-03 15:44:46 +03:00
|
|
|
|
|
|
|
|
|
const CHRONOLOGICAL_WORKS: Work[] = [
|
2022-08-04 13:13:16 +03:00
|
|
|
|
{
|
|
|
|
|
name: RepoLink("vnetod", "/pleshevskiy/vnetod"),
|
|
|
|
|
description: "Dotenv section switcher",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
|
|
|
|
startDate: "2022",
|
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("estring", "github.com/pleshevskiy/estring"),
|
|
|
|
|
description: "A simple way to parse a string using type annotations.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
|
|
|
|
startDate: "2022",
|
|
|
|
|
statuses: [Status.ActiveDeveloped],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("enve", "github.com/pleshevskiy/enve"),
|
|
|
|
|
description:
|
|
|
|
|
"It helps you work with environment variables and convert it to any type using only type annotations",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
|
|
|
|
startDate: "2022",
|
|
|
|
|
statuses: [Status.ActiveDeveloped],
|
|
|
|
|
},
|
2022-07-22 13:53:25 +03:00
|
|
|
|
{
|
|
|
|
|
name: RepoLink("dexios", "github.com/brxken128/dexios"),
|
|
|
|
|
description:
|
|
|
|
|
"Dexios is a fast, secure, and open source command-line encryption tool.",
|
|
|
|
|
roles: [Role.Collaborator],
|
|
|
|
|
technologies: [Technology.Rust],
|
|
|
|
|
startDate: "2022",
|
|
|
|
|
statuses: [Status.ActiveDeveloped],
|
|
|
|
|
},
|
2022-07-03 15:44:46 +03:00
|
|
|
|
{
|
|
|
|
|
name: RepoLink("paren", "/pleshevskiy/paren"),
|
|
|
|
|
description: "Library for parsing and rendering information.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.TypeScript, Technology.Deno],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2022",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.ActiveDeveloped, Status.Experimental],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("recipes", "/pleshevskiy/recipes"),
|
|
|
|
|
description: "Site with recipes which cares about privacy",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.TypeScript, Technology.Deno, Technology.Rust],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2022",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.ActiveDeveloped],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("pleshevski.ru", "/pleshevskiy/pleshevski.ru"),
|
|
|
|
|
description: "Source code of my personal site",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [
|
|
|
|
|
Technology.TypeScript,
|
|
|
|
|
Technology.Deno,
|
|
|
|
|
Technology.Docker,
|
|
|
|
|
Technology.Drone,
|
|
|
|
|
],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2022",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
|
|
|
|
{
|
2022-07-03 16:18:43 +03:00
|
|
|
|
name: RepoLink("docker stack drone plugin", "/drone_plugins/docker_stack"),
|
2022-07-03 15:44:46 +03:00
|
|
|
|
description: "Deploy to production using `docker stack deploy`",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Docker, Technology.Drone],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2022",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("hwt", "//github.com/pleshevskiy/hwt"),
|
|
|
|
|
description:
|
|
|
|
|
"healthy workaholic timer – A tool that keeps you from breaking your health by working all day.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2022",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.ActiveDeveloped],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("migra", "//github.com/pleshevskiy/migra"),
|
|
|
|
|
description: "Simple SQL migration manager for your project.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2021",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.AsIs],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink(
|
|
|
|
|
"ood_persistence",
|
|
|
|
|
"//github.com/pleshevskiy/ood_persistence",
|
|
|
|
|
),
|
|
|
|
|
description:
|
|
|
|
|
"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2021",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.Deprecated, Status.Experimental],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink(
|
|
|
|
|
"espruino-starter",
|
|
|
|
|
"//github.com/pleshevskiy/espruino-starter",
|
|
|
|
|
),
|
|
|
|
|
description:
|
|
|
|
|
"Quickly start creating your new project on the espruino board or a board based on it.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.JavaScript],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2021",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.AsIs],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink(
|
|
|
|
|
"sonic-channel",
|
|
|
|
|
"//github.com/pleshevskiy/sonic-channel",
|
|
|
|
|
),
|
|
|
|
|
description: "Rust client for sonic search backend.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2020",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink(
|
|
|
|
|
"react-rest-request",
|
|
|
|
|
"//github.com/pleshevskiy/react-rest-request",
|
|
|
|
|
),
|
|
|
|
|
description: "Minimalistic REST API client for React inspired by Apollo.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.TypeScript, Technology.React],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2020",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.AsIs],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("itconfig", "/pleshevskiy/itconfig"),
|
|
|
|
|
description:
|
|
|
|
|
"Easy build a configs from environment variables and use it in globally.",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Rust],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2019",
|
2022-07-22 13:53:25 +03:00
|
|
|
|
statuses: [Status.ActiveDeveloped],
|
2022-07-03 15:44:46 +03:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("it-fsm", "/pleshevskiy/it-fsm"),
|
|
|
|
|
description: "Simple full-featured finite state machine for your project",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.TypeScript, Technology.NodeJS, Technology.Deno],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2019",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: Link("Cabinet Master Progress", {
|
|
|
|
|
href: "https://cabinet.masterprogress.ru",
|
|
|
|
|
}),
|
|
|
|
|
description:
|
|
|
|
|
"Student's cabinet of the educational center Master Progress (SSR + SPA)",
|
|
|
|
|
roles: [Role.TechLead],
|
|
|
|
|
technologies: [
|
|
|
|
|
Technology.Python,
|
|
|
|
|
Technology.Flask,
|
|
|
|
|
Technology.Postgresql,
|
|
|
|
|
Technology.TypeScript,
|
|
|
|
|
Technology.React,
|
|
|
|
|
Technology.Docker,
|
|
|
|
|
Technology.Drone,
|
|
|
|
|
],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2019",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
2022-07-03 16:18:43 +03:00
|
|
|
|
{
|
|
|
|
|
name: RepoLink("genrss", "//github.com/icetemple/genrss"),
|
|
|
|
|
description: "RSS generator for python",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Python],
|
|
|
|
|
startDate: "2019",
|
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink(
|
|
|
|
|
"marshmallow_pageinfo",
|
|
|
|
|
"//github.com/icetemple/marshmallow_pageinfo",
|
|
|
|
|
),
|
|
|
|
|
description: "Page info marshmallow schema for api",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Python],
|
|
|
|
|
startDate: "2019",
|
|
|
|
|
statuses: [Status.AsIs],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: Link("BinaryManagement", {
|
|
|
|
|
href: "https://www.binarymanagement.com",
|
|
|
|
|
}),
|
|
|
|
|
description: "Project management tool for interior designers",
|
|
|
|
|
roles: [Role.Developer, Role.TechLead, Role.TeamLead],
|
|
|
|
|
technologies: [
|
|
|
|
|
Technology.TypeScript,
|
|
|
|
|
Technology.NodeJS,
|
|
|
|
|
Technology.React,
|
|
|
|
|
Technology.Antd,
|
|
|
|
|
Technology.Docker,
|
|
|
|
|
Technology.Drone,
|
|
|
|
|
],
|
|
|
|
|
startDate: "2018",
|
|
|
|
|
statuses: [Status.ActiveDeveloped],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: Link("CoreSpirit", { href: "https://corespirit.com" }),
|
|
|
|
|
description: "Social platform focusing on human and planetary enhancement",
|
|
|
|
|
roles: [Role.Developer],
|
|
|
|
|
technologies: [
|
|
|
|
|
Technology.TypeScript,
|
|
|
|
|
Technology.NodeJS,
|
|
|
|
|
Technology.React,
|
|
|
|
|
Technology.Docker,
|
|
|
|
|
],
|
|
|
|
|
startDate: "2018",
|
|
|
|
|
endDate: "2019",
|
|
|
|
|
},
|
2022-07-03 15:44:46 +03:00
|
|
|
|
{
|
|
|
|
|
name: Link("Master Progress", { href: "https://masterprogress.ru" }),
|
|
|
|
|
description:
|
|
|
|
|
"Main website of the educational center Master Progress (SSR + Forms)",
|
|
|
|
|
roles: [Role.TechLead],
|
|
|
|
|
technologies: [
|
|
|
|
|
Technology.Python,
|
|
|
|
|
Technology.Flask,
|
|
|
|
|
Technology.JavaScript,
|
|
|
|
|
Technology.Docker,
|
|
|
|
|
Technology.Drone,
|
|
|
|
|
],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2018",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.PassivelyMaintained],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("ictmpl", "//github.com/pleshevskiy/ictmpl"),
|
|
|
|
|
description: "Generate projects from templates",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Python],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2018",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.AsIs],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: RepoLink("jjcrypto", "//github.com/pleshevskiy/ictmpl"),
|
|
|
|
|
description: "Javascript encoder and decoder",
|
|
|
|
|
roles: [Role.Author],
|
|
|
|
|
technologies: [Technology.Php],
|
2022-07-03 16:18:43 +03:00
|
|
|
|
startDate: "2015",
|
2022-07-03 15:44:46 +03:00
|
|
|
|
statuses: [Status.AsIs],
|
|
|
|
|
},
|
|
|
|
|
];
|