Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
 ┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages