Browse Source

initial activity tracker

Daniel Sheffield 3 months ago
parent
commit
018c152fb8

+ 6 - 0
activities/sqlpage/migrations/001_activities.sql

@@ -0,0 +1,6 @@
+DROP TABLE IF EXISTS activities;
+CREATE TABLE activities (
+  user TEXT,
+  ts TIMESTAMP,
+  activity TEXT
+);

+ 4 - 0
activities/sqlpage/sqlpage.json

@@ -0,0 +1,4 @@
+{
+  "database_url": "sqlite://:memory:",
+  "max_database_pool_connections": 16
+}

+ 78 - 0
activities/www/chart.sql

@@ -0,0 +1,78 @@
+SET ":user" = COALESCE(:user, $user, '');
+--SET ":date" = (SELECT COALESCE(CASE COALESCE(:date, '')
+--  WHEN '' THEN NULL
+--  ELSE :date
+--END, CASE COALESCE($date, '')
+--  WHEN '' THEN NULL
+--  ELSE $date
+--END, CURRENT_TIMESTAMP));
+SET ":date" = COALESCE(:date, $date, CURRENT_TIMESTAMP);
+SET ":date" = (SELECT datetime(datetime(:date, 'localtime'), 'start of day'));
+
+SELECT 'chart' AS component
+, '' AS title -- date(:date) AS title
+, TRUE AS time
+, 'area' AS type
+, 1 AS ymax
+, 0 AS ymin
+, 1 AS ystep
+, '100' AS height
+;
+
+--SELECT 'table' AS component;
+SELECT datetime(CASE y
+  WHEN 0 THEN datetime(x, '-00:00:01.000')
+  WHEN 2 THEN datetime(x, '+00:00:01.000')
+  ELSE x
+END, 'localtime') AS x, series, CASE y % 2 WHEN 1 THEN 1 ELSE NULL END AS y FROM (
+SELECT ts AS x
+, activity AS series
+, 0 AS y
+FROM activities a
+WHERE user = :user
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
+AND EXISTS (SELECT * FROM (
+  SELECT lag.activity
+  FROM activities lag
+  WHERE lag.ts < a.ts
+  ORDER BY ts ASC
+  LIMIT 1
+) q WHERE q.activity <> activity)
+UNION
+SELECT ts AS x
+, activity AS series
+, 1 AS y
+FROM activities a
+WHERE user = :user
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
+UNION
+SELECT COALESCE((
+  SELECT lag.ts
+  FROM activities lag
+  WHERE lag.ts > a.ts AND lag.activity <> a.activity
+  AND datetime(datetime(lag.ts, 'localtime'), 'start of day') = :date
+  ORDER BY ts ASC
+  LIMIT 1
+), CURRENT_TIMESTAMP) AS x
+, activity AS series
+, 1 AS y
+FROM activities a
+WHERE user = :user
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
+UNION
+SELECT COALESCE((
+  SELECT lag.ts
+  FROM activities lag
+  WHERE lag.ts > a.ts AND lag.activity <> a.activity
+  AND datetime(datetime(lag.ts, 'localtime'), 'start of day') = :date
+  ORDER BY ts ASC
+  LIMIT 1
+), CURRENT_TIMESTAMP) AS x
+, activity AS series
+, 2 AS y
+FROM activities a
+WHERE user = :user
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
+) q
+ORDER BY x ASC, y ASC
+;

+ 46 - 0
activities/www/index.sql

@@ -0,0 +1,46 @@
+INSERT INTO activities(user, activity, ts)
+SELECT :user, :activity, COALESCE(CASE COALESCE(:ts, '')
+  WHEN '' THEN NULL
+  ELSE datetime(:ts, 'utc')
+END, CURRENT_TIMESTAMP)
+WHERE COALESCE(:activity, '') <> ''
+RETURNING 'redirect' AS component, '/' AS link
+;
+
+SET ":user" = 'shannon';
+SET ":title" = 'Activities';
+SELECT 'shell' AS component
+, 'dark' AS theme
+, :title AS title
+;
+
+SELECT 'form' AS component;
+SELECT 'select' AS type
+, 'Activity' AS label
+, 'activity' AS name
+, TRUE AS create_new
+, TRUE AS dropdown
+, (SELECT json_group_array(json_object(
+    'label', activity,
+    'value', activity,
+    'selected', activity = 'Unknown'
+  )) FROM activities WHERE user = :user
+) AS options
+, 8 AS width
+;
+SELECT 'datetime-local' AS type
+, 'ts' AS name
+, 'Date and Time' AS label
+, '' AS value
+, 4 AS width
+;SELECT 'card' AS component
+, 1 AS columns
+;
+
+SELECT date(datetime(CURRENT_TIMESTAMP, '-'|| value ||'  days')) AS title
+, '/chart.sql'||
+'?user='||:user||
+'&date='|| REPLACE(datetime(CURRENT_TIMESTAMP, '-'|| value ||'  days'), ' ', '+') ||
+'&_sqlpage_embed' AS embed
+FROM json_each(json('[0, 1, 2, 3, 4, 5, 6, 7]'))
+;