lesli_bell 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +5 -0
  3. data/app/assets/config/lesli_bell_manifest.js +40 -0
  4. data/app/assets/javascripts/lesli_bell/application.js +2848 -0
  5. data/app/assets/stylesheets/lesli_bell/application.css +15 -0
  6. data/app/controllers/lesli_bell/accounts_controller.rb +4 -0
  7. data/app/controllers/lesli_bell/announcements_controller.rb +60 -0
  8. data/app/controllers/lesli_bell/application_controller.rb +4 -0
  9. data/app/controllers/lesli_bell/dashboards_controller.rb +59 -0
  10. data/app/controllers/lesli_bell/notifications_controller.rb +60 -0
  11. data/app/helpers/lesli_bell/accounts_helper.rb +4 -0
  12. data/app/helpers/lesli_bell/announcements_helper.rb +4 -0
  13. data/app/helpers/lesli_bell/application_helper.rb +4 -0
  14. data/app/helpers/lesli_bell/dashboards_helper.rb +4 -0
  15. data/app/helpers/lesli_bell/notifications_helper.rb +4 -0
  16. data/app/jobs/lesli_bell/application_job.rb +4 -0
  17. data/app/mailers/lesli_bell/application_mailer.rb +6 -0
  18. data/app/models/lesli_bell/account.rb +7 -0
  19. data/app/models/lesli_bell/announcement.rb +4 -0
  20. data/app/models/lesli_bell/application_record.rb +5 -0
  21. data/app/models/lesli_bell/dashboard.rb +4 -0
  22. data/app/models/lesli_bell/notification.rb +28 -0
  23. data/app/services/lesli_bell/notification_service.rb +87 -0
  24. data/app/views/lesli_bell/accounts/_account.html.erb +2 -0
  25. data/app/views/lesli_bell/accounts/_form.html.erb +17 -0
  26. data/app/views/lesli_bell/accounts/edit.html.erb +10 -0
  27. data/app/views/lesli_bell/accounts/index.html.erb +14 -0
  28. data/app/views/lesli_bell/accounts/new.html.erb +9 -0
  29. data/app/views/lesli_bell/accounts/show.html.erb +10 -0
  30. data/app/views/lesli_bell/announcements/_announcement.html.erb +2 -0
  31. data/app/views/lesli_bell/announcements/_form.html.erb +17 -0
  32. data/app/views/lesli_bell/announcements/edit.html.erb +10 -0
  33. data/app/views/lesli_bell/announcements/index.html.erb +14 -0
  34. data/app/views/lesli_bell/announcements/new.html.erb +9 -0
  35. data/app/views/lesli_bell/announcements/show.html.erb +10 -0
  36. data/app/views/lesli_bell/dashboards/_dashboard.html.erb +2 -0
  37. data/app/views/lesli_bell/dashboards/_form.html.erb +17 -0
  38. data/app/views/lesli_bell/dashboards/edit.html.erb +10 -0
  39. data/app/views/lesli_bell/dashboards/index.html.erb +14 -0
  40. data/app/views/lesli_bell/dashboards/new.html.erb +9 -0
  41. data/app/views/lesli_bell/dashboards/show.html.erb +1 -0
  42. data/app/views/lesli_bell/notifications/edit.html.erb +10 -0
  43. data/app/views/lesli_bell/notifications/index.html.erb +33 -0
  44. data/app/views/lesli_bell/notifications/new.html.erb +9 -0
  45. data/app/views/lesli_bell/notifications/show.html.erb +10 -0
  46. data/app/views/lesli_bell/partials/_engine-navigation.html.erb +24 -0
  47. data/config/routes.rb +6 -0
  48. data/db/migrate/v1.0/0308000110_create_lesli_bell_accounts.rb +28 -0
  49. data/db/migrate/v1.0/0308100110_create_lesli_bell_notifications.rb +41 -0
  50. data/db/migrate/v1.0/0308100210_create_lesli_bell_notification_activities.rb +17 -0
  51. data/db/migrate/v1.0/0308110110_create_lesli_bell_announcements.rb +40 -0
  52. data/db/migrate/v1.0/0308110210_create_lesli_bell_announcement_activities.rb +17 -0
  53. data/db/migrate/v1.0/0308110310_create_lesli_bell_announcement_users.rb +12 -0
  54. data/db/seed/development.rb +36 -0
  55. data/db/seed/production.rb +0 -0
  56. data/db/seed/test.rb +0 -0
  57. data/db/seeds.rb +25 -0
  58. data/lib/lesli_bell/engine.rb +18 -0
  59. data/lib/lesli_bell/version.rb +4 -0
  60. data/lib/lesli_bell.rb +6 -0
  61. data/lib/tasks/lesli_bell_tasks.rake +4 -0
  62. data/lib/vue/application.js +51 -0
  63. data/lib/vue/apps/announcements/components/form.vue +237 -0
  64. data/lib/vue/apps/announcements/index.vue +124 -0
  65. data/lib/vue/apps/announcements/new.vue +48 -0
  66. data/lib/vue/apps/notifications/components/notification-form.vue +149 -0
  67. data/lib/vue/apps/notifications/index.vue +129 -0
  68. data/lib/vue/apps/notifications/new.vue +45 -0
  69. data/lib/vue/stores/announcement.js +142 -0
  70. data/lib/vue/stores/notification.js +115 -0
  71. data/readme.md +28 -0
  72. metadata +116 -0
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ class AccountsController < ApplicationController
3
+ end
4
+ end
@@ -0,0 +1,60 @@
1
+ module LesliBell
2
+ class AnnouncementsController < ApplicationController
3
+ before_action :set_announcement, only: %i[ show edit update destroy ]
4
+
5
+ # GET /announcements
6
+ def index
7
+ @announcements = Announcement.all
8
+ end
9
+
10
+ # GET /announcements/1
11
+ def show
12
+ end
13
+
14
+ # GET /announcements/new
15
+ def new
16
+ @announcement = Announcement.new
17
+ end
18
+
19
+ # GET /announcements/1/edit
20
+ def edit
21
+ end
22
+
23
+ # POST /announcements
24
+ def create
25
+ @announcement = Announcement.new(announcement_params)
26
+
27
+ if @announcement.save
28
+ redirect_to @announcement, notice: "Announcement was successfully created."
29
+ else
30
+ render :new, status: :unprocessable_entity
31
+ end
32
+ end
33
+
34
+ # PATCH/PUT /announcements/1
35
+ def update
36
+ if @announcement.update(announcement_params)
37
+ redirect_to @announcement, notice: "Announcement was successfully updated.", status: :see_other
38
+ else
39
+ render :edit, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ # DELETE /announcements/1
44
+ def destroy
45
+ @announcement.destroy
46
+ redirect_to announcements_url, notice: "Announcement was successfully destroyed.", status: :see_other
47
+ end
48
+
49
+ private
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_announcement
52
+ @announcement = Announcement.find(params[:id])
53
+ end
54
+
55
+ # Only allow a list of trusted parameters through.
56
+ def announcement_params
57
+ params.fetch(:announcement, {})
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ class ApplicationController < Lesli::ApplicationLesliController
3
+ end
4
+ end
@@ -0,0 +1,59 @@
1
+ module LesliBell
2
+ class DashboardsController < ApplicationController
3
+ #before_action :set_dashboard, only: %i[ show edit update destroy ]
4
+
5
+ # GET /dashboards
6
+ def index
7
+ end
8
+
9
+ # GET /dashboards/1
10
+ def show
11
+ end
12
+
13
+ # GET /dashboards/new
14
+ def new
15
+ @dashboard = Dashboard.new
16
+ end
17
+
18
+ # GET /dashboards/1/edit
19
+ def edit
20
+ end
21
+
22
+ # POST /dashboards
23
+ def create
24
+ @dashboard = Dashboard.new(dashboard_params)
25
+
26
+ if @dashboard.save
27
+ redirect_to @dashboard, notice: "Dashboard was successfully created."
28
+ else
29
+ render :new, status: :unprocessable_entity
30
+ end
31
+ end
32
+
33
+ # PATCH/PUT /dashboards/1
34
+ def update
35
+ if @dashboard.update(dashboard_params)
36
+ redirect_to @dashboard, notice: "Dashboard was successfully updated.", status: :see_other
37
+ else
38
+ render :edit, status: :unprocessable_entity
39
+ end
40
+ end
41
+
42
+ # DELETE /dashboards/1
43
+ def destroy
44
+ @dashboard.destroy
45
+ redirect_to dashboards_url, notice: "Dashboard was successfully destroyed.", status: :see_other
46
+ end
47
+
48
+ private
49
+ # Use callbacks to share common setup or constraints between actions.
50
+ def set_dashboard
51
+ @dashboard = Dashboard.find(params[:id])
52
+ end
53
+
54
+ # Only allow a list of trusted parameters through.
55
+ def dashboard_params
56
+ params.fetch(:dashboard, {})
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,60 @@
1
+ module LesliBell
2
+ class NotificationsController < ApplicationController
3
+ before_action :set_notification, only: %i[ show edit update destroy ]
4
+
5
+ # GET /notifications
6
+ def index
7
+ @notifications = Notification.all
8
+ end
9
+
10
+ # GET /notifications/1
11
+ def show
12
+ end
13
+
14
+ # GET /notifications/new
15
+ def new
16
+ @notification = Notification.new
17
+ end
18
+
19
+ # GET /notifications/1/edit
20
+ def edit
21
+ end
22
+
23
+ # POST /notifications
24
+ def create
25
+ @notification = Notification.new(notification_params)
26
+
27
+ if @notification.save
28
+ redirect_to @notification, notice: "Notification was successfully created."
29
+ else
30
+ render :new, status: :unprocessable_entity
31
+ end
32
+ end
33
+
34
+ # PATCH/PUT /notifications/1
35
+ def update
36
+ if @notification.update(notification_params)
37
+ redirect_to @notification, notice: "Notification was successfully updated.", status: :see_other
38
+ else
39
+ render :edit, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ # DELETE /notifications/1
44
+ def destroy
45
+ @notification.destroy
46
+ redirect_to notifications_url, notice: "Notification was successfully destroyed.", status: :see_other
47
+ end
48
+
49
+ private
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_notification
52
+ @notification = Notification.find(params[:id])
53
+ end
54
+
55
+ # Only allow a list of trusted parameters through.
56
+ def notification_params
57
+ params.fetch(:notification, {})
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ module AccountsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ module AnnouncementsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ module DashboardsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ module NotificationsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module LesliBell
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+ layout "mailer"
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ module LesliBell
2
+ class Account < ApplicationRecord
3
+ belongs_to :account, class_name: "::Lesli::Account"
4
+ has_many :notifications
5
+ has_many :announcements
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ class Announcement < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module LesliBell
2
+ class ApplicationRecord < Lesli::ApplicationLesliRecord
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module LesliBell
2
+ class Dashboard < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,28 @@
1
+ module LesliBell
2
+ class Notification < ApplicationRecord
3
+ belongs_to :account, class_name: "LesliBell::Account"
4
+ belongs_to :user, class_name: "::Lesli::User"
5
+
6
+
7
+ enum category: {
8
+ info: "info",
9
+ danger: "danger",
10
+ warning: "warning",
11
+ success: "success"
12
+ }
13
+
14
+ enum channel: {
15
+ push: "push", # webpush & mobilepush
16
+ email: "email", # notification sent by email only
17
+ webpush: "webpush", # notification for web interface only
18
+ mobilepush: "mobilepush", # notification for mobile only
19
+ mobiledialog: "mobiledialog", # open a dialog in the main app screen
20
+ }
21
+
22
+ enum status: {
23
+ read: "read",
24
+ sent: "sent",
25
+ created: "created"
26
+ }
27
+ end
28
+ end
@@ -0,0 +1,87 @@
1
+ module LesliBell
2
+ class NotificationService < Lesli::ApplicationLesliService
3
+
4
+ def index only_own_notifications=true
5
+
6
+ notifications = []
7
+
8
+ # work with all notifications
9
+ notifications = current_user.account.bell
10
+ .notifications
11
+ .order(created_at: :DESC)
12
+
13
+ # work only with notifications that belongs to the user
14
+ if only_own_notifications
15
+ notifications = notifications.where(:user => current_user, :status => ["created", "sent", nil])
16
+ end
17
+
18
+ # add pagination
19
+ notifications = notifications
20
+ .page(query[:pagination][:page])
21
+ .per(query[:pagination][:perPage])
22
+ .order(:updated_at)
23
+
24
+ return notifications
25
+
26
+ LC::Response.pagination(
27
+ notifications.current_page,
28
+ notifications.total_pages,
29
+ notifications.total_count,
30
+ notifications.length,
31
+ notifications.map do |notification|
32
+ {
33
+ id: notification[:id],
34
+ url: notification[:url],
35
+ body: notification[:body],
36
+ subject: notification[:subject],
37
+ category: notification[:category],
38
+ created_at: LC::Date.distance_to_words(notification[:created_at]),
39
+ status: notification[:status],
40
+ }
41
+ end
42
+ )
43
+
44
+ end
45
+
46
+ def create(
47
+ subject,
48
+ url:nil,
49
+ body:nil,
50
+ media:nil,
51
+ payload:nil,
52
+ channel:nil,
53
+ category:nil,
54
+ user_receiver_id:nil,
55
+ notification_type:nil,
56
+ role_receiver_names:nil,
57
+ user_receiver_emails:nil
58
+ )
59
+
60
+ # validate that the notifications has a valid category
61
+ category = 'info' if not ['info', 'danger', 'warning', 'success'].include?(category)
62
+
63
+ # set push (web and mobile) notifications as default channel
64
+ channel = 'push' unless channel
65
+
66
+ # base notification data
67
+ notification_params = {
68
+ url: url,
69
+ body: body,
70
+ media: media,
71
+ payload: payload,
72
+ channel: channel,
73
+ subject: subject,
74
+ category: category,
75
+ notification_type: notification_type,
76
+ status: 'created',
77
+ user: current_user
78
+ }
79
+
80
+ # "bulk insert" all the notifications
81
+ notifications = current_user.account.bell.notifications.create([notification_params])
82
+
83
+ return { id: notifications.map(&:id) }
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,2 @@
1
+ <div id="<%= dom_id account %>">
2
+ </div>
@@ -0,0 +1,17 @@
1
+ <%= form_with(model: account) do |form| %>
2
+ <% if account.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(account.errors.count, "error") %> prohibited this account from being saved:</h2>
5
+
6
+ <ul>
7
+ <% account.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.submit %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <h1>Editing account</h1>
2
+
3
+ <%= render "form", account: @account %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this account", @account %> |
9
+ <%= link_to "Back to accounts", accounts_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Accounts</h1>
4
+
5
+ <div id="accounts">
6
+ <% @accounts.each do |account| %>
7
+ <%= render account %>
8
+ <p>
9
+ <%= link_to "Show this account", account %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New account", new_account_path %>
@@ -0,0 +1,9 @@
1
+ <h1>New account</h1>
2
+
3
+ <%= render "form", account: @account %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to accounts", accounts_path %>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <%= render @account %>
4
+
5
+ <div>
6
+ <%= link_to "Edit this account", edit_account_path(@account) %> |
7
+ <%= link_to "Back to accounts", accounts_path %>
8
+
9
+ <%= button_to "Destroy this account", @account, method: :delete %>
10
+ </div>
@@ -0,0 +1,2 @@
1
+ <div id="<%= dom_id announcement %>">
2
+ </div>
@@ -0,0 +1,17 @@
1
+ <%= form_with(model: announcement) do |form| %>
2
+ <% if announcement.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(announcement.errors.count, "error") %> prohibited this announcement from being saved:</h2>
5
+
6
+ <ul>
7
+ <% announcement.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.submit %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <h1>Editing announcement</h1>
2
+
3
+ <%= render "form", announcement: @announcement %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this announcement", @announcement %> |
9
+ <%= link_to "Back to announcements", announcements_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Announcements</h1>
4
+
5
+ <div id="announcements">
6
+ <% @announcements.each do |announcement| %>
7
+ <%= render announcement %>
8
+ <p>
9
+ <%= link_to "Show this announcement", announcement %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New announcement", new_announcement_path %>
@@ -0,0 +1,9 @@
1
+ <h1>New announcement</h1>
2
+
3
+ <%= render "form", announcement: @announcement %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to announcements", announcements_path %>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <%= render @announcement %>
4
+
5
+ <div>
6
+ <%= link_to "Edit this announcement", edit_announcement_path(@announcement) %> |
7
+ <%= link_to "Back to announcements", announcements_path %>
8
+
9
+ <%= button_to "Destroy this announcement", @announcement, method: :delete %>
10
+ </div>
@@ -0,0 +1,2 @@
1
+ <div id="<%= dom_id dashboard %>">
2
+ </div>
@@ -0,0 +1,17 @@
1
+ <%= form_with(model: dashboard) do |form| %>
2
+ <% if dashboard.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(dashboard.errors.count, "error") %> prohibited this dashboard from being saved:</h2>
5
+
6
+ <ul>
7
+ <% dashboard.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.submit %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <h1>Editing dashboard</h1>
2
+
3
+ <%= render "form", dashboard: @dashboard %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this dashboard", @dashboard %> |
9
+ <%= link_to "Back to dashboards", dashboards_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Dashboards</h1>
4
+
5
+ <div id="dashboards">
6
+ <% @dashboards.each do |dashboard| %>
7
+ <%= render dashboard %>
8
+ <p>
9
+ <%= link_to "Show this dashboard", dashboard %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New dashboard", new_dashboard_path %>
@@ -0,0 +1,9 @@
1
+ <h1>New dashboard</h1>
2
+
3
+ <%= render "form", dashboard: @dashboard %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to dashboards", dashboards_path %>
9
+ </div>
@@ -0,0 +1 @@
1
+ <router-view></router-view>
@@ -0,0 +1,10 @@
1
+ <h1>Editing notification</h1>
2
+
3
+ <%= render "form", notification: @notification %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this notification", @notification %> |
9
+ <%= link_to "Back to notifications", notifications_path %>
10
+ </div>
@@ -0,0 +1,33 @@
1
+ <%#
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.dev
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ %>
32
+
33
+ <router-view></router-view>
@@ -0,0 +1,9 @@
1
+ <h1>New notification</h1>
2
+
3
+ <%= render "form", notification: @notification %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to notifications", notifications_path %>
9
+ </div>