Initial upload

This commit is contained in:
Vlad Kostyanetsky 2024-03-24 22:27:44 +04:00
parent 05c5f5ec3c
commit 2fba8ca86f
21 changed files with 2597 additions and 21 deletions

10
.editorconfig Normal file
View file

@ -0,0 +1,10 @@
# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = tab
indent_size = 4
tab_width = 4

3
.eslintignore Normal file
View file

@ -0,0 +1,3 @@
node_modules/
main.js

23
.eslintrc Normal file
View file

@ -0,0 +1,23 @@
{
"root": true,
"parser": "@typescript-eslint/parser",
"env": { "node": true },
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
"parserOptions": {
"sourceType": "module"
},
"rules": {
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": ["error", { "args": "none" }],
"@typescript-eslint/ban-ts-comment": "off",
"no-prototype-builtins": "off",
"@typescript-eslint/no-empty-function": "off"
}
}

32
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,32 @@
name: Release Obsidian plugin
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: "20.x"
- name: Build plugin
run: |
npm install
npm run build
- name: Create release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
tag="${GITHUB_REF#refs/tags/}"
gh release create "$tag" \
--title="$tag" \
--draft \
main.js manifest.json styles.css

9
.gitignore vendored Normal file
View file

@ -0,0 +1,9 @@
# npm
node_modules
# Obsidian
main.js
data.json
# Sourcemaps
*.map

1
.npmrc Normal file
View file

@ -0,0 +1 @@
tag-version-prefix=""

7
CHANGELOG.md Normal file
View file

@ -0,0 +1,7 @@
# Changelog
## 1.0.0 - ?
### Added
* Calculation of working time by task labels.

42
LICENSE
View file

@ -1,21 +1,21 @@
MIT License
Copyright (c) 2024 Vlad Kostyanetsky
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
MIT License
Copyright (c) 2024 Vlad Kostyanetsky
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

6
README.md Normal file
View file

@ -0,0 +1,6 @@
# Timesheet ⌛ 📑 ⏲️
It is a plugin for [Obsidian](https://obsidian.md) designed to generate timesheets for tasks in your daily notes.
## 🙂 How to use it?

48
esbuild.config.mjs Normal file
View file

@ -0,0 +1,48 @@
import esbuild from "esbuild";
import process from "process";
import builtins from "builtin-modules";
const banner =
`/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
`;
const prod = (process.argv[2] === "production");
const context = await esbuild.context({
banner: {
js: banner,
},
entryPoints: ["src/main.ts"],
bundle: true,
external: [
"obsidian",
"electron",
"@codemirror/autocomplete",
"@codemirror/collab",
"@codemirror/commands",
"@codemirror/language",
"@codemirror/lint",
"@codemirror/search",
"@codemirror/state",
"@codemirror/view",
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
...builtins],
format: "cjs",
target: "es2018",
logLevel: "info",
sourcemap: prod ? false : "inline",
treeShaking: true,
outfile: "main.js",
});
if (prod) {
await context.rebuild();
process.exit(0);
} else {
await context.watch();
}

10
manifest.json Normal file
View file

@ -0,0 +1,10 @@
{
"id": "timesheet",
"name": "Timesheet",
"version": "1.0.0",
"minAppVersion": "1.5.3",
"description": "Timesheet generator for tasks in daily notes.",
"author": "vkostyanetsky",
"authorUrl": "https://github.com/vkostyanetsky",
"isDesktopOnly": false
}

2229
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

24
package.json Normal file
View file

@ -0,0 +1,24 @@
{
"name": "timesheet",
"version": "1.0.0",
"description": "Timesheet generator for Obsidian.",
"main": "main.js",
"scripts": {
"dev": "node esbuild.config.mjs",
"build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
"version": "node version-bump.mjs && git add manifest.json versions.json"
},
"keywords": [],
"author": "",
"license": "MIT",
"devDependencies": {
"@types/node": "^16.11.6",
"@typescript-eslint/eslint-plugin": "5.29.0",
"@typescript-eslint/parser": "5.29.0",
"builtin-modules": "3.3.0",
"esbuild": "0.17.3",
"obsidian": "latest",
"tslib": "2.4.0",
"typescript": "4.7.4"
}
}

View file

@ -0,0 +1,15 @@
import {
MarkdownPostProcessorContext,
MarkdownRenderer,
} from 'obsidian'
import Timesheet from '../main'
export default class TimesheetCodeBlock {
public static async renderDiary(plugin: Timesheet, src: string, body: HTMLElement, ctx: MarkdownPostProcessorContext)
{
}
}

36
src/main.ts Normal file
View file

@ -0,0 +1,36 @@
import {
Plugin,
Editor,
MarkdownView,
} from 'obsidian';
import {
TimesheetSettingTab,
TimesheetSettings,
DEFAULT_SETTINGS
} from './settings';
import TimesheetCodeBlock from './codeblocks/timesheet';
export default class Timesheet extends Plugin {
settings: TimesheetSettings;
async onload() {
await this.loadSettings();
this.addSettingTab(new TimesheetSettingTab(this.app, this));
}
onunload() {
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
}
}

81
src/settings.ts Normal file
View file

@ -0,0 +1,81 @@
import {
App,
PluginSettingTab,
Setting,
} from 'obsidian';
import Timesheet from './main';
export interface TimesheetSettings {
hideLabels: boolean;
hideTimeIntervals: boolean;
hideEmptyBrackets: boolean;
showTimeOverlapWarnings: boolean;
}
export const DEFAULT_SETTINGS: TimesheetSettings = {
hideLabels: false,
hideTimeIntervals: true,
hideEmptyBrackets: false,
showTimeOverlapWarnings: true,
}
export class TimesheetSettingTab extends PluginSettingTab {
plugin: Timesheet;
constructor(app: App, plugin: Timesheet){
super(app, plugin);
this.plugin = plugin;
}
display(): void {
const {containerEl} = this;
containerEl.empty();
new Setting(containerEl)
.setName('Warn about time overlaps')
.setDesc('Show warnings if there are time intervals overlapping. For instanse, a task has "10:00-11:00" while another has "10:30-11:00".')
.addToggle(text => text
.setValue(this.plugin.settings.showTimeOverlapWarnings)
.onChange(async (value) => {
this.plugin.settings.showTimeOverlapWarnings = value;
await this.plugin.saveSettings();
}));
containerEl.createEl("h2", { text: "Task Titles" });
new Setting(containerEl)
.setName('Hide labels')
.setDesc('Hide task labels while generating a timesheet.')
.addToggle(text => text
.setValue(this.plugin.settings.hideLabels)
.onChange(async (value) => {
this.plugin.settings.hideLabels = value;
await this.plugin.saveSettings();
}));
new Setting(containerEl)
.setName('Hide time intervals')
.setDesc('Hide task time intervals while generating a timesheet.')
.addToggle(text => text
.setValue(this.plugin.settings.hideTimeIntervals)
.onChange(async (value) => {
this.plugin.settings.hideTimeIntervals = value;
await this.plugin.saveSettings();
}));
new Setting(containerEl)
.setName('Hide empty brackets')
.setDesc('Hide empty brackets in a task title (they can appear after applying the settings above).')
.addToggle(text => text
.setValue(this.plugin.settings.hideEmptyBrackets)
.onChange(async (value) => {
this.plugin.settings.hideEmptyBrackets = value;
await this.plugin.saveSettings();
}));
}
}

0
src/types.ts Normal file
View file

1
styles.css Normal file
View file

@ -0,0 +1 @@
/* not in use */

24
tsconfig.json Normal file
View file

@ -0,0 +1,24 @@
{
"compilerOptions": {
"baseUrl": ".",
"inlineSourceMap": true,
"inlineSources": true,
"module": "ESNext",
"target": "ES6",
"allowJs": true,
"noImplicitAny": true,
"moduleResolution": "node",
"importHelpers": true,
"isolatedModules": true,
"strictNullChecks": true,
"lib": [
"DOM",
"ES5",
"ES6",
"ES7"
]
},
"include": [
"**/*.ts"
]
}

14
version-bump.mjs Normal file
View file

@ -0,0 +1,14 @@
import { readFileSync, writeFileSync } from "fs";
const targetVersion = process.env.npm_package_version;
// read minAppVersion from manifest.json and bump version to target version
let manifest = JSON.parse(readFileSync("manifest.json", "utf8"));
const { minAppVersion } = manifest;
manifest.version = targetVersion;
writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t"));
// update versions.json with target version and minAppVersion from manifest.json
let versions = JSON.parse(readFileSync("versions.json", "utf8"));
versions[targetVersion] = minAppVersion;
writeFileSync("versions.json", JSON.stringify(versions, null, "\t"));

3
versions.json Normal file
View file

@ -0,0 +1,3 @@
{
"1.0.0": "1.5.3"
}