204 lines
7.1 KiB
JavaScript
204 lines
7.1 KiB
JavaScript
const { Gio } = imports.gi;
|
|
import Widget from 'resource:///com/github/Aylur/ags/widget.js';
|
|
import * as Utils from 'resource:///com/github/Aylur/ags/utils.js';
|
|
const { Box, Button, Label } = Widget;
|
|
import { MaterialIcon } from '../.commonwidgets/materialicon.js';
|
|
import { setupCursorHover } from '../.widgetutils/cursorhover.js';
|
|
|
|
import { TodoWidget } from "./todolist.js";
|
|
import { getCalendarLayout } from "./calendar_layout.js";
|
|
|
|
let calendarJson = getCalendarLayout(undefined, true);
|
|
let monthshift = 0;
|
|
|
|
function getDateInXMonthsTime(x) {
|
|
var currentDate = new Date(); // Get the current date
|
|
var targetMonth = currentDate.getMonth() + x; // Calculate the target month
|
|
var targetYear = currentDate.getFullYear(); // Get the current year
|
|
|
|
// Adjust the year and month if necessary
|
|
targetYear += Math.floor(targetMonth / 12);
|
|
targetMonth = (targetMonth % 12 + 12) % 12;
|
|
|
|
// Create a new date object with the target year and month
|
|
var targetDate = new Date(targetYear, targetMonth, 1);
|
|
|
|
// Set the day to the last day of the month to get the desired date
|
|
// targetDate.setDate(0);
|
|
|
|
return targetDate;
|
|
}
|
|
|
|
const weekDays = [ // MONDAY IS THE FIRST DAY OF THE WEEK :HESRIGHTYOUKNOW:
|
|
{ day: 'Mo', today: 0 },
|
|
{ day: 'Tu', today: 0 },
|
|
{ day: 'We', today: 0 },
|
|
{ day: 'Th', today: 0 },
|
|
{ day: 'Fr', today: 0 },
|
|
{ day: 'Sa', today: 0 },
|
|
{ day: 'Su', today: 0 },
|
|
]
|
|
|
|
const CalendarDay = (day, today) => Widget.Button({
|
|
className: `sidebar-calendar-btn ${today == 1 ? 'sidebar-calendar-btn-today' : (today == -1 ? 'sidebar-calendar-btn-othermonth' : '')}`,
|
|
child: Widget.Overlay({
|
|
child: Box({}),
|
|
overlays: [Label({
|
|
hpack: 'center',
|
|
className: 'txt-smallie txt-semibold sidebar-calendar-btn-txt',
|
|
label: String(day),
|
|
})],
|
|
})
|
|
})
|
|
|
|
const CalendarWidget = () => {
|
|
const calendarMonthYear = Widget.Button({
|
|
className: 'txt txt-large sidebar-calendar-monthyear-btn',
|
|
onClicked: () => shiftCalendarXMonths(0),
|
|
setup: (button) => {
|
|
button.label = `${new Date().toLocaleString('default', { month: 'long' })} ${new Date().getFullYear()}`;
|
|
setupCursorHover(button);
|
|
}
|
|
});
|
|
const addCalendarChildren = (box, calendarJson) => {
|
|
const children = box.get_children();
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
child.destroy();
|
|
}
|
|
box.children = calendarJson.map((row, i) => Widget.Box({
|
|
className: 'spacing-h-5',
|
|
children: row.map((day, i) => CalendarDay(day.day, day.today)),
|
|
}))
|
|
}
|
|
function shiftCalendarXMonths(x) {
|
|
if (x == 0) monthshift = 0;
|
|
else monthshift += x;
|
|
var newDate;
|
|
if (monthshift == 0) newDate = new Date();
|
|
else newDate = getDateInXMonthsTime(monthshift);
|
|
|
|
calendarJson = getCalendarLayout(newDate, (monthshift == 0));
|
|
calendarMonthYear.label = `${monthshift == 0 ? '' : '• '}${newDate.toLocaleString('default', { month: 'long' })} ${newDate.getFullYear()}`;
|
|
addCalendarChildren(calendarDays, calendarJson);
|
|
}
|
|
const calendarHeader = Widget.Box({
|
|
className: 'spacing-h-5 sidebar-calendar-header',
|
|
setup: (box) => {
|
|
box.pack_start(calendarMonthYear, false, false, 0);
|
|
box.pack_end(Widget.Box({
|
|
className: 'spacing-h-5',
|
|
children: [
|
|
Button({
|
|
className: 'sidebar-calendar-monthshift-btn',
|
|
onClicked: () => shiftCalendarXMonths(-1),
|
|
child: MaterialIcon('chevron_left', 'norm'),
|
|
setup: setupCursorHover,
|
|
}),
|
|
Button({
|
|
className: 'sidebar-calendar-monthshift-btn',
|
|
onClicked: () => shiftCalendarXMonths(1),
|
|
child: MaterialIcon('chevron_right', 'norm'),
|
|
setup: setupCursorHover,
|
|
})
|
|
]
|
|
}), false, false, 0);
|
|
}
|
|
})
|
|
const calendarDays = Widget.Box({
|
|
hexpand: true,
|
|
vertical: true,
|
|
className: 'spacing-v-5',
|
|
setup: (box) => {
|
|
addCalendarChildren(box, calendarJson);
|
|
}
|
|
});
|
|
return Widget.EventBox({
|
|
onScrollUp: () => shiftCalendarXMonths(-1),
|
|
onScrollDown: () => shiftCalendarXMonths(1),
|
|
child: Widget.Box({
|
|
hpack: 'center',
|
|
children: [
|
|
Widget.Box({
|
|
hexpand: true,
|
|
vertical: true,
|
|
className: 'spacing-v-5',
|
|
children: [
|
|
calendarHeader,
|
|
Widget.Box({
|
|
homogeneous: true,
|
|
className: 'spacing-h-5',
|
|
children: weekDays.map((day, i) => CalendarDay(day.day, day.today))
|
|
}),
|
|
calendarDays,
|
|
]
|
|
})
|
|
]
|
|
})
|
|
});
|
|
};
|
|
|
|
const defaultShown = 'calendar';
|
|
const contentStack = Widget.Stack({
|
|
hexpand: true,
|
|
children: {
|
|
'calendar': CalendarWidget(),
|
|
'todo': TodoWidget(),
|
|
// 'stars': Widget.Label({ label: 'GitHub feed will be here' }),
|
|
},
|
|
transition: 'slide_up_down',
|
|
transitionDuration: userOptions.animations.durationLarge,
|
|
setup: (stack) => Utils.timeout(1, () => {
|
|
stack.shown = defaultShown;
|
|
})
|
|
})
|
|
|
|
const StackButton = (stackItemName, icon, name) => Widget.Button({
|
|
className: 'button-minsize sidebar-navrail-btn txt-small spacing-h-5',
|
|
onClicked: (button) => {
|
|
contentStack.shown = stackItemName;
|
|
const kids = button.get_parent().get_children();
|
|
for (let i = 0; i < kids.length; i++) {
|
|
if (kids[i] != button) kids[i].toggleClassName('sidebar-navrail-btn-active', false);
|
|
else button.toggleClassName('sidebar-navrail-btn-active', true);
|
|
}
|
|
},
|
|
child: Box({
|
|
className: 'spacing-v-5',
|
|
vertical: true,
|
|
children: [
|
|
Label({
|
|
className: `txt icon-material txt-hugeass`,
|
|
label: icon,
|
|
}),
|
|
Label({
|
|
label: name,
|
|
className: 'txt txt-smallie',
|
|
}),
|
|
]
|
|
}),
|
|
setup: (button) => Utils.timeout(1, () => {
|
|
setupCursorHover(button);
|
|
button.toggleClassName('sidebar-navrail-btn-active', defaultShown === stackItemName);
|
|
})
|
|
});
|
|
|
|
export const ModuleCalendar = () => Box({
|
|
className: 'sidebar-group spacing-h-5',
|
|
setup: (box) => {
|
|
box.pack_start(Box({
|
|
vpack: 'center',
|
|
homogeneous: true,
|
|
vertical: true,
|
|
className: 'sidebar-navrail spacing-v-10',
|
|
children: [
|
|
StackButton('calendar', 'calendar_month', 'Calendar'),
|
|
StackButton('todo', 'done_outline', 'To Do'),
|
|
// StackButton(box, 'stars', 'star', 'GitHub'),
|
|
]
|
|
}), false, false, 0);
|
|
box.pack_end(contentStack, false, false, 0);
|
|
}
|
|
})
|
|
|