card-mod-account 0.14.2 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: adc87bf8c7fbcd353a929064f4f624b62c82d2bd832f14bc117f51932904d508
4
- data.tar.gz: 8c6ec9b150b12be1d4d2d4af7cfc707aa75717dbac5410ceccf0ae723392469d
3
+ metadata.gz: 6746b209fb026dba9a6d3954907e85d8e2d7fe41d0f3b19e7abccbe564e75b19
4
+ data.tar.gz: 84fa785cfd4022c10b6b491aaacdfa352903f86c9a2f2e1379c352508b74df51
5
5
  SHA512:
6
- metadata.gz: 4e310f6dd5ebe29872f2b8a851a853966b172ffd43c191f42ee95e1a80862f19bf39f1889d2bf0dc533e60550bec7bb929cf2e150c4bbeac5387c114d9cd4b6d
7
- data.tar.gz: 6434b7b07a78fdba72e11dcb9e53e86e13f4b973fe1d059c30010989db062d4055f309791b0574c9139108715744bef1e4c765e660f5d5bc039adef0d36ba7e4
6
+ metadata.gz: 47734b784a923c88b2720564c86b55ef8c335f84beaf1d6ccb40e90b8fa786a45e0497d32f9f12f41c3f62778ca2d9f06426803f8754b0a911be451e2372904c
7
+ data.tar.gz: c50dbdc1ef16286cc8c80957fdf30e8ad7e5c6bf176838b87377bb086bcb20bf21d6e81fc9eb5abe9efd37fcd650541e2d31031c09e93c88a42db9605dc4cedb
@@ -0,0 +1,36 @@
1
+ /*----------- (Account Request)--------------*/
2
+
3
+ .invite-links {
4
+ padding: 10px;
5
+ margin-top: 10px;
6
+ text-align: center;
7
+ a {
8
+ font-weight: bold;
9
+ margin: 0 20px;
10
+ }
11
+ }
12
+
13
+ /*-- sign in page --*/
14
+
15
+ #sign-in input#login_field,
16
+ #sign-in input#password,
17
+ #forgot-password input#email {
18
+ width: 50%;
19
+ }
20
+
21
+ #forgot-password {
22
+ margin-top: 40px;
23
+ }
24
+
25
+ .new-account-link {
26
+ text-align: center;
27
+ }
28
+
29
+ .form-group .signup-link {
30
+ display: inline;
31
+ }
32
+
33
+ // FIXME - decko should handle better
34
+ #my-card-link {
35
+ padding-right: 0.6em;
36
+ }
data/data/real.yml ADDED
@@ -0,0 +1,300 @@
1
+ ---
2
+ # Cardtypes
3
+
4
+ - :name: Role
5
+ :type: :cardtype
6
+ :codename: role
7
+ :fields:
8
+ :description: |-
9
+ Each [[user]] can be given roles to organize site permissions.
10
+ [[http://decko.org/Role|Learn more about roles]].
11
+
12
+ - :name: "*members"
13
+ :codename: members
14
+
15
+
16
+ # Roles
17
+
18
+ - :name: Anyone
19
+ :type: :role
20
+ :codename: anyone
21
+ :fields:
22
+ :description: |-
23
+ Everyone has this role, whether signed in or not. [[http://decko.org/account|more]]
24
+ - :name: Anyone Signed In
25
+ :type: :role
26
+ :codename: anyone_signed_in
27
+ :fields:
28
+ :description: |-
29
+ Anyone who is signed in has this role. [[http://decko.org/account|more]]
30
+ - :name: Administrator
31
+ :type: :role
32
+ :codename: administrator
33
+ :fields:
34
+ :description: |-
35
+ [[_left+:members|Administrators]] can create, read, update and delete any card.
36
+ [[http://decko.org/permissions|more]]
37
+ :members:
38
+ :fields:
39
+ :self:
40
+ :fields:
41
+ :update: Administrator
42
+ - :name: Eagle
43
+ :type: :role
44
+ :codename: eagle
45
+ :fields:
46
+ :description: "[[Eagle+:members|Eagle users]] can add and edit content."
47
+ - :name: Shark
48
+ :type: :role
49
+ :codename: shark
50
+ :fields:
51
+ :description: |-
52
+ [[_left+:members|Shark users]] can configure the deck and create structures.
53
+ :members:
54
+ :fields:
55
+ :self:
56
+ :fields:
57
+ :update: Administrator
58
+ - :name: Help Desk
59
+ :type: :role
60
+ :codename: help_desk
61
+ :fields:
62
+ :description: |-
63
+ [[_left+*members|Help Desk users]] can manage accounts and edit help text.
64
+ :members:
65
+ :fields:
66
+ :self:
67
+ :fields:
68
+ :update: Administrator
69
+ - :name: Anonymous
70
+ :codename: anonymous
71
+ :content: "<p>Edits made by people who are not signed in are credited to Anonymous.
72
+ [[http://decko.org/account|Learn more about accounts]].</p>"
73
+
74
+ - :name:
75
+ - :role
76
+ - :members
77
+ - :type_plus_right
78
+ - :update
79
+ :content:
80
+ Help Desk
81
+
82
+ - :name: "*account"
83
+ :codename: account
84
+ :fields:
85
+ :right:
86
+ :fields:
87
+ :create: Administrator
88
+ :read: Help Desk
89
+ :update: Help Desk
90
+ :delete: Help Desk
91
+ :content: |-
92
+ <div>When someone signs up, they create a [[Sign up]] card...</div>
93
+ <blockquote>
94
+ <div>{{Sign up|closed;title: Sign ups}}</div>
95
+ </blockquote>
96
+ <div>...that can be changed into a [[User]] card:</div>
97
+ <blockquote>
98
+ <div>{{User|title: Users; closed}}</div>
99
+ </blockquote>
100
+ <div>Some important [[http://decko.org/permissions|permissions]]:</div>
101
+ <div>
102
+ <ul>
103
+ <li>When [[Anyone]] can [[*create|create]] a [[Sign up]] card, links to sign up will appear.</li>
104
+ <li>When [[Anyone]] can [[*create|create]] a [[User]] card, each [[Sign up]] can be auto-approved with a verification email.</li>
105
+ <li>If permission to [[*create|create]] a [[User]] is restricted, someone with that permission must approve each [[Sign up]] by hand.</li>
106
+ </ul>
107
+ </div>
108
+ <h5>Related links</h5>
109
+ <ul>
110
+ <li><em>[[http://decko.org/account | Accounts docs]]</em></li>
111
+ <li><em>[[Cards with accounts]]</em></li>
112
+ <li><em>[[:account+:right+:by_name|Account cards]]</em></li>
113
+ </ul>
114
+
115
+ # :account fields
116
+
117
+ - :name: "*email"
118
+ :codename: email
119
+ :fields:
120
+ :right:
121
+ :fields:
122
+ :update: Help Desk
123
+ :delete: Help Desk
124
+ :read: Help Desk
125
+ - :name: "*password"
126
+ :codename: password
127
+ :fields:
128
+ :right:
129
+ :fields:
130
+ :update: Help Desk
131
+ :delete: Help Desk
132
+ :read: Help Desk
133
+ - :name: "*salt"
134
+ :codename: salt
135
+ :fields:
136
+ :right:
137
+ :fields:
138
+ :read: Help Desk
139
+ - :name: "*status"
140
+ :codename: status
141
+ :fields:
142
+ :right:
143
+ :fields:
144
+ :update: Help Desk
145
+ :delete: Help Desk
146
+ :read: Help Desk
147
+
148
+ - :name: "*account settings"
149
+ :codename: account_settings
150
+ :fields:
151
+ :right:
152
+ :fields:
153
+ :structure: |-
154
+ {{_left+:account|content}}
155
+ {{_left+:roles|title: Roles}}
156
+ {{_left+:follow|title: Notification choices}}
157
+
158
+ - :name: Sign up
159
+ :type: :cardtype
160
+ :codename: signup
161
+ :fields:
162
+ :description: |-
163
+ [[Sign up]] cards represent not-yet-approved accounts.
164
+ When approved, they become [[User]] cards. [[http://decko.org/account|more]]
165
+ :self:
166
+ :fields:
167
+ :structure: |-
168
+ <p>{{+:description|content}}</p>
169
+ <h2>{{_self|name}} Cards</h2>
170
+ <blockquote><p>{{+:type+:by_name|content}}</p></blockquote>
171
+ :type:
172
+ :fields:
173
+ :create: Anyone
174
+ :on_create: signup alert email
175
+ :account:
176
+ :fields:
177
+ :type_plus_right:
178
+ :fields:
179
+ :create: _left
180
+ - :name:
181
+ - :user
182
+ - :account
183
+ - :type_plus_right
184
+ - :create
185
+ :content: _left
186
+
187
+ - :name:
188
+ - :wagn_bot
189
+ - :account
190
+ :fields:
191
+ :email: no-reply@decko.org
192
+
193
+ - :name: welcome email
194
+ :type: :email_template
195
+ :codename: welcome_email
196
+ - :name: verification email
197
+ :type: :email_template
198
+ :codename: verification_email
199
+ :fields:
200
+ :from: Decko Bot
201
+ :subject: verification link for {{:title|core}}
202
+ :html_message: |-
203
+ <div style="text-align:center">
204
+ <h1>Thank you for signing up with {{:title|core}}!</h1>
205
+ <p>
206
+ Please <a href="{{_|verify_url}}">follow this link</a>
207
+ to verify this email address and activate your account.
208
+ </p>
209
+ <p><em>Link will remain valid for {{_|verify_days}} days.</em></p>
210
+ </div>
211
+ :text_message: |+
212
+ Thank you for signing up with {{:title|core}}!
213
+
214
+ Please follow the link below to verify this email address and activate your account.
215
+
216
+ {{_|verify_url}}
217
+ (Link will remain valid for {{_|verify_days}} days.)
218
+ - :name: password reset email
219
+ :type: :email_template
220
+ :codename: password_reset_email
221
+ :fields:
222
+ :from: Decko Bot
223
+ :subject: reset password for {{:title|core}}
224
+ :text_message: "** Password reset for {{:title|core}} **\n\nSomeone – you, we hope –
225
+ asked to reset your password. Please follow this link...\n\n {{_|reset_password_url}}\n
226
+ \ \n...to update your account details.\n\n\n(Link will remain valid for {{_|reset_password_days}}
227
+ days.)\n\n"
228
+ :html_message: "<div style=\"text-align:center\">\n
229
+ <h1>Password reset for {{:title|core}}</h1>\n
230
+ \ \n <p>Someone – you, we hope – asked to reset your password.</p>\n \n <p>Please
231
+ <a href=\"{{_|reset_password_url}}\">follow this link</a> to update your account
232
+ details.</p>\n \n <p><em>Link will remain valid for {{_|reset_password_days}}
233
+ days.</em></p>\n</div>\n\n"
234
+ - :name: signup alert email
235
+ :type: :email_template
236
+ :codename: signup_alert_email
237
+ :fields:
238
+ :from: _user
239
+ :subject: "{{_|name}} signed up for {{:title|core}}"
240
+ :text_message: |
241
+ {{_|name}} has signed up on {{:title|core}}.
242
+
243
+ See {{_|name}}'s card: {{_|url}}
244
+
245
+ -- the machines running {{:title|core}}
246
+ :html_message: |
247
+ <p>
248
+ {{_|name}}
249
+ has <a href="{{_|url}}">signed up</a>
250
+ on {{:title|core}}.
251
+ </p>
252
+
253
+ <p><em>-- the machines running {{:title|core}}</em></p>
254
+
255
+
256
+ - :name: "*signin"
257
+ :codename: signin
258
+ :conflict: :defer
259
+ :fields:
260
+ :self:
261
+ :fields:
262
+ :update: Anyone
263
+ - :name: "*roles"
264
+ :codename: roles
265
+ :fields:
266
+ :right:
267
+ :fields:
268
+ :input_type: checkbox
269
+ :content_options:
270
+ :type: :search_type
271
+ :content: '{"type":"role", "not":{"codename":["in","anyone","anyone_signed_in"]}}'
272
+
273
+
274
+ - :name: "*enabled roles"
275
+ :codename: enabled_roles
276
+ - :name: "*account links"
277
+ :codename: account_links
278
+
279
+ - :name: Cards with accounts
280
+ :type: :search_type
281
+ :codename: cards_with_account
282
+ :content: '{"right_plus": ":account"}'
283
+
284
+ - :name: "*thanks"
285
+ :type: :setting
286
+ :codename: thanks
287
+ - :name:
288
+ - :signup
289
+ - :type
290
+ - :thanks
291
+ :type: :phrase
292
+ :content: :signup_success
293
+
294
+ - :name: Signup Success
295
+ :codename: signup_success
296
+ :content: |-
297
+ <div>
298
+ Thank you for signing up with {{:title|core}}.
299
+ You should receive a response in your email.
300
+ </div>
@@ -0,0 +1,47 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ class MoveRoles < Cardio::Migration
4
+ def up
5
+ remove_member_structure_rule
6
+ change_existing_member_cards_to_lists
7
+ populate_member_lists_and_delete_role_lists
8
+ end
9
+
10
+ def remove_member_structure_rule
11
+ %i[members right structure].card&.delete!
12
+ end
13
+
14
+ def change_existing_member_cards_to_lists
15
+ Card.search(left: { type_id: Card::RoleID },
16
+ right_id: Card::MembersID) do |role_members|
17
+ role_members.update! type_id: Card::ListID
18
+ end
19
+ end
20
+
21
+ def populate_member_lists_and_delete_role_lists
22
+ Card.search(left: { type_id: Card::UserID },
23
+ right_id: Card::RolesID) do |user_roles|
24
+ role_names = role_names_from_user_roles_card user_roles.id
25
+ move_role_names user_roles.left.name, role_names if role_names.present?
26
+ user_roles.delete
27
+ end
28
+ end
29
+
30
+ def move_role_names user, role_names
31
+ role_names.each do |role_name|
32
+ next unless role_name.card&.type_code == :role
33
+
34
+ puts "Move #{user} to role #{role_name}"
35
+ Card.fetch(role_name, :members, new: {}).add_item! user
36
+ end
37
+ end
38
+
39
+ def role_names_from_user_roles_card id
40
+ query = "SELECT db_content FROM cards WHERE cards.id = #{id}"
41
+ content = ActiveRecord::Base.connection
42
+ .exec_query(query)
43
+ .rows&.first&.first
44
+ return unless content.present?
45
+ content.split "\n"
46
+ end
47
+ end
data/locales/de.yml CHANGED
@@ -104,7 +104,7 @@ de:
104
104
  account_password_missing: Passwort muss angegeben werden
105
105
  account_private_data: Private Daten
106
106
  account_reset_my_password: Passwort zurücksetzen
107
- account_reset_password: PASSWORT ZURÜCKSETZEN
107
+ account_reset_password: Password Zurücksetzen
108
108
  account_search_email_duplicate: E-Mail-Duplikat? (%{content})
109
109
  account_sign_in: Anmelden
110
110
  account_sign_in_title: Anmelden
data/locales/en.yml CHANGED
@@ -21,7 +21,7 @@ en:
21
21
  account_password_missing: password can't be blank
22
22
  account_private_data: Private data
23
23
  account_reset_my_password: Reset my password
24
- account_reset_password: RESET PASSWORD
24
+ account_reset_password: Reset Password
25
25
  account_search_email_duplicate: email duplicate? (%{content})
26
26
  account_sign_in: Sign in
27
27
  account_sign_in_title: Sign In
@@ -6,9 +6,7 @@ end
6
6
 
7
7
  # allow account owner to update account field content
8
8
  def ok_to_update
9
- return true if own_account? && !name_changed? && !type_id_changed?
10
-
11
- super
9
+ (own_account? && !name_changed? && !type_id_changed?) || super
12
10
  end
13
11
 
14
12
  # force inherit permission on create
@@ -37,7 +37,7 @@ format :html do
37
37
  ["Email and Password", :account,
38
38
  { path: { slot: { hide: %i[help_link bridge_link] } } }],
39
39
  ["Roles", :roles,
40
- { path: { view: :content_with_edit_button } }],
40
+ { path: { view: :content } }],
41
41
  ["Notifications", :follow],
42
42
  ["API", :account,
43
43
  { path: { view: :api_key,
data/set/all/account.rb CHANGED
@@ -15,7 +15,7 @@ end
15
15
  def among? ok_ids
16
16
  ok_ids.any? do |ok_id|
17
17
  ok_id == AnyoneID ||
18
- (ok_id == AnyoneWithRoleID && all_enabled_roles.size > 1) ||
18
+ # (ok_id == AnyoneWithRoleID && all_enabled_roles.size > 1) ||
19
19
  parties.member?(ok_id)
20
20
  end
21
21
  end
@@ -86,14 +86,11 @@ def enabled_roles_card
86
86
  end
87
87
 
88
88
  def fetch_roles
89
- [AnyoneSignedInID] + role_ids_from_roles_trait
89
+ [AnyoneSignedInID] + role_ids_from_role_member_cards
90
90
  end
91
91
 
92
- def role_ids_from_roles_trait
93
- Auth.as_bot do
94
- role_trait = fetch :roles
95
- role_trait ? role_trait.item_ids : []
96
- end
92
+ def role_ids_from_role_member_cards
93
+ Self::Role.role_ids id
97
94
  end
98
95
 
99
96
  event :generate_token do
@@ -1,11 +1,11 @@
1
1
  #### ON CREATE
2
2
 
3
3
  event :set_default_salt, :prepare_to_validate, on: :create do
4
- subfield(:salt).generate
4
+ field(:salt).generate
5
5
  end
6
6
 
7
7
  event :set_default_status, :prepare_to_validate, on: :create do
8
- subfield :status, content: (accounted&.try(:default_account_status) || "active")
8
+ field :status, content: (accounted&.try(:default_account_status) || "active")
9
9
  end
10
10
 
11
11
  # ON UPDATE
@@ -47,7 +47,7 @@ end
47
47
  # NOTE: this only works in the context of an action.
48
48
  # if run independently, it will not activate an account
49
49
  event :activate_account do
50
- subfield :status, content: "active"
50
+ field :status, content: "active"
51
51
  trigger_event! :send_welcome_email
52
52
  end
53
53
 
@@ -50,7 +50,8 @@ format :html do
50
50
  end
51
51
 
52
52
  before :content_formgroups do
53
- voo.edit_structure = [[:email, "email"], [:password, "password"]]
53
+ voo.edit_structure = [[:email, title: "email"],
54
+ [:password, title: "password"]]
54
55
  end
55
56
 
56
57
  view :token_expiry do
data/set/right/account.rb CHANGED
@@ -21,9 +21,7 @@ end
21
21
 
22
22
  # allow account owner to update account field content
23
23
  def ok_to_update
24
- return true if own_account? && !name_changed? && !type_id_changed?
25
-
26
- super
24
+ (own_account? && !name_changed? && !type_id_changed?) || super
27
25
  end
28
26
 
29
27
  def changes_visible? act
data/set/right/email.rb CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  include_set Abstract::AccountField
4
4
 
5
+ assign_type :phrase
6
+
5
7
  event :validate_email, :validate, on: :save do
6
8
  return unless content?
7
9
 
@@ -31,7 +33,7 @@ event :downcase_email, :prepare_to_validate, on: :save do
31
33
  end
32
34
 
33
35
  def email_required?
34
- !left.system?
36
+ !left&.left&.codename == :wagn_bot
35
37
  end
36
38
 
37
39
  def ok_to_read
@@ -1,5 +1,7 @@
1
1
  include_set Abstract::AccountField
2
2
 
3
+ assign_type :phrase
4
+
3
5
  def history?
4
6
  false
5
7
  end
data/set/right/roles.rb CHANGED
@@ -1,27 +1,9 @@
1
- event :validate_permission_to_assign_roles, :validate, on: :save do
2
- return unless (fr = forbidden_roles).present?
1
+ assign_type :search_type
3
2
 
4
- errors.add :permission_denied,
5
- "You don't have permission to assign the role#{'s' if fr.size > 1} "\
6
- "#{fr.map(&:name).to_sentence}" # LOCALIZE
3
+ def virtual?
4
+ new?
7
5
  end
8
6
 
9
- def forbidden_roles
10
- # restore old roles for permission check
11
- with_old_role_permissions do |new_roles|
12
- new_roles.reject do |card|
13
- Card.fetch(card, "*members").ok? :update
14
- end
15
- end
16
- end
17
-
18
- def with_old_role_permissions
19
- new_roles = item_cards
20
- new_content = content
21
- left.clear_roles
22
- Auth.update_always_cache nil
23
- self.content = db_content_before_act
24
- yield new_roles
25
- ensure
26
- self.content = new_content
7
+ def cql_content
8
+ { member: "_left" }
27
9
  end
data/set/right/salt.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  include_set Abstract::AccountField
2
2
 
3
+ assign_type :phrase
4
+
3
5
  def generate
4
6
  self.content = Digest::SHA1.hexdigest "--#{Time.zone.now}--"
5
7
  end
data/set/right/status.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  include_set Abstract::AccountField
2
- include_set Abstract::Pointer
2
+ include_set Abstract::List
3
+
4
+ assign_type :phrase
3
5
 
4
6
  format :html do
5
7
  def input_type
@@ -8,7 +10,7 @@ format :html do
8
10
  end
9
11
 
10
12
  def option_names
11
- %w[unapproved unverified active blocked system]
13
+ %w[unapproved unverified active blocked] # system
12
14
  end
13
15
 
14
16
  def ok_to_update
data/set/self/role.rb ADDED
@@ -0,0 +1,38 @@
1
+ class << self
2
+ CACHE_KEY = "ROLEHASH".freeze
3
+
4
+ def load_rolehash
5
+ ::Card.cache.fetch(CACHE_KEY) do
6
+ generate_rolehash
7
+ end
8
+ end
9
+
10
+ def generate_rolehash
11
+ Auth.as_bot do
12
+ Card.search(left: { type_id: Card::RoleID }, right_id: Card::MembersID)
13
+ .each_with_object({}) do |member_card, hash|
14
+ hash[member_card.left_id] = ::Set.new member_card.item_ids
15
+ end
16
+ end
17
+ end
18
+
19
+ def update_rolehash role_id, member_ids
20
+ role_hash[role_id] = member_ids
21
+ ::Card.cache.write CACHE_KEY, role_hash
22
+ end
23
+
24
+ def clear_rolehash
25
+ @role_hash = nil
26
+ end
27
+
28
+ def role_hash
29
+ @role_hash ||= load_rolehash
30
+ end
31
+
32
+ def role_ids user_id
33
+ role_hash.each_with_object([]) do |(role_id, member_ids), all_role_ids|
34
+ next unless member_ids.include? user_id
35
+ all_role_ids << role_id
36
+ end
37
+ end
38
+ end
data/set/self/signin.rb CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  # authentication event
10
10
  event :signin, :validate, on: :update do
11
- authenticate_or_abort subfield_content(:email), subfield_content(:password)
11
+ authenticate_or_abort field_content(:email), field_content(:password)
12
12
  end
13
13
 
14
14
  # abort after successful signin (do not save card)
@@ -30,8 +30,8 @@ event :send_reset_password_token, before: :signin, on: :update, trigger: :requir
30
30
  end
31
31
  end
32
32
 
33
- def email_from_subfield
34
- @email_from_subfield ||= subfield_content(:email)
33
+ def email_from_field
34
+ @email_from_field ||= field_content(:email)
35
35
  end
36
36
 
37
37
  def ok_to_read
@@ -76,7 +76,7 @@ def account_for email
76
76
  end
77
77
 
78
78
  def send_reset_password_email_or_fail
79
- if (account = account_for email_from_subfield)&.active?
79
+ if (account = account_for email_from_field)&.active?
80
80
  send_reset_password_email account
81
81
  else
82
82
  reset_password_fail account
@@ -84,7 +84,7 @@ def send_reset_password_email_or_fail
84
84
  end
85
85
 
86
86
  def blank_email?
87
- return false if email_from_subfield.present?
87
+ return false if email_from_field.present?
88
88
 
89
89
  error_on :email, :error_blank
90
90
  end
@@ -151,8 +151,12 @@ format :html do
151
151
  end
152
152
 
153
153
  view :signin_buttons do
154
+ class_up "button-form-group", "signin-buttons justify-content-between"
154
155
  button_formgroup do
155
- [signin_button, signup_link, reset_password_link]
156
+ [
157
+ wrap_with("div", class: "pe-2") { [signin_button, signup_link] },
158
+ reset_password_link
159
+ ]
156
160
  end
157
161
  end
158
162
 
@@ -186,10 +190,9 @@ format :html do
186
190
  end
187
191
 
188
192
  def reset_password_link
189
- link = link_to_view :edit, t(:account_reset_password),
190
- path: { slot: { hide: :bridge_link } }
191
- # FIXME: inline styling
192
- raw("<div style='float:right'>#{link}</div>")
193
+ link_to_view :edit, t(:account_reset_password),
194
+ path: { slot: { hide: :bridge_link } },
195
+ class: "btn btn-secondary btn-reset-password"
193
196
  end
194
197
 
195
198
  def edit_view_hidden
data/set/type/role.rb CHANGED
@@ -1,3 +1,5 @@
1
+ card_accessor :members
2
+
1
3
  def disabled?
2
4
  Auth.current&.fetch(:disabled_roles)&.item_ids&.include? id
3
5
  end
@@ -9,7 +11,7 @@ format :html do
9
11
 
10
12
  def role_checkbox
11
13
  name = card.disabled? ? "add_item" : "drop_item"
12
- subformat(Auth.current.field(:disabled_roles, new: {})).card_form :update do
14
+ subformat(Auth.current.field(:disabled_roles)).card_form :update do
13
15
  [check_box_tag(name, card.id, !card.disabled?, class: "_edit-item"),
14
16
  render_link]
15
17
  end
@@ -3,7 +3,7 @@ format :html do
3
3
  Auth.signed_in? && card.can_approve?
4
4
  end
5
5
 
6
- view :new do
6
+ view :new, cache: :never do
7
7
  voo.title = invitation? ? t(:account_invite) : t(:account_sign_up)
8
8
  super()
9
9
  end
@@ -12,7 +12,7 @@ format :html do
12
12
  [account_formgroups, (card.structure ? edit_slot : "")].join
13
13
  end
14
14
 
15
- view :new_buttons do
15
+ view :new_buttons, cache: :never do
16
16
  button_formgroup do
17
17
  [standard_create_button, invite_button].compact
18
18
  end
@@ -24,7 +24,7 @@ format :html do
24
24
  button_tag "Send Invitation", situation: "primary"
25
25
  end
26
26
 
27
- view :core, template: :haml do
27
+ view :core, template: :haml, cache: :never do
28
28
  @lines = [signup_line] + account_lines
29
29
  @body = process_content _render_raw
30
30
  end
data/set/type/signup.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  include_set Abstract::Accountable
2
2
 
3
+ basket[:non_createable_types] << :signup
4
+
3
5
  require_field :account
4
6
 
5
7
  def default_account_status
@@ -26,7 +28,7 @@ event :approve_without_verification, :validate, on: :update, trigger: :required
26
28
  # TODO: if validated here, add trigger and activate in storage phase
27
29
  approvable do
28
30
  activate_accounted
29
- subfield(:account).activate_account
31
+ field(:account).activate_account
30
32
  end
31
33
  end
32
34
 
@@ -36,8 +38,8 @@ event :act_as_current_for_integrate_stage, :integrate, on: :create do
36
38
  end
37
39
 
38
40
  def request_verification
39
- acct = subfield :account
40
- acct.subfield :status, content: "unverified"
41
+ acct = field :account
42
+ acct.field :status, content: "unverified"
41
43
  acct.trigger_event! :send_verification_email
42
44
  end
43
45
 
@@ -5,6 +5,6 @@
5
5
 
6
6
 
7
7
  - if Card.config.action_mailer.perform_deliveries == false
8
- .bg-warning.p-3
8
+ .alert-warning.p-3
9
9
  WARNING: Email delivery is turned off.
10
10
  Change settings in config/application.rb to send sign up notifications.
data/set/type/user.rb CHANGED
@@ -3,7 +3,9 @@ include_set Abstract::Accountable
3
3
  attr_accessor :email
4
4
 
5
5
  format :html do
6
- view :setup, unknown: true, perms: ->(_fmt) { Auth.needs_setup? } do
6
+ delegate :needs_setup?, to: Card::Auth
7
+
8
+ view :setup, unknown: true, perms: :needs_setup? do
7
9
  with_nest_mode :edit do
8
10
  voo.title = "Your deck is ready to go!" # LOCALIZE
9
11
  voo.show! :help
@@ -41,6 +43,7 @@ format :html do
41
43
  end
42
44
  end
43
45
 
46
+ # FIXME. use trigger
44
47
  def setup?
45
48
  Card::Env.params[:setup]
46
49
  end
@@ -54,8 +57,10 @@ event :setup_as_bot, before: :check_permissions, on: :create, when: :setup? do
54
57
  end
55
58
 
56
59
  event :setup_first_user, :prepare_to_store, on: :create, when: :setup? do
57
- subcard "signup alert email+*to", content: name
58
- subfield :roles, content: roles_for_first_user
60
+ subcard %i[signup_alert_email to].cardname, content: name
61
+ roles_for_first_user.each do |role|
62
+ subcard [role, :members], content: name
63
+ end
59
64
  end
60
65
 
61
66
  def roles_for_first_user
@@ -0,0 +1,5 @@
1
+ assign_type :list
2
+
3
+ event :update_role_cache, :finalize do
4
+ Self::Role.update_rolehash(left.id, item_ids)
5
+ end
@@ -1,3 +1,7 @@
1
+ def virtual?
2
+ new?
3
+ end
4
+
1
5
  # supports legacy references to <User>+*email
2
6
  # (standard representation is now <User>+*account+*email)
3
7
  view :raw do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card-mod-account
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.2
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ethan McCutchen
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-01-08 00:00:00.000000000 Z
13
+ date: 2023-01-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: card
@@ -18,56 +18,84 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.104.2
21
+ version: 1.105.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 1.104.2
28
+ version: 1.105.0
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: card-mod-email
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - '='
34
34
  - !ruby/object:Gem::Version
35
- version: 0.14.2
35
+ version: 0.15.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - '='
41
41
  - !ruby/object:Gem::Version
42
- version: 0.14.2
42
+ version: 0.15.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: card-mod-permissions
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - '='
48
48
  - !ruby/object:Gem::Version
49
- version: 0.14.2
49
+ version: 0.15.0
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - '='
55
55
  - !ruby/object:Gem::Version
56
- version: 0.14.2
56
+ version: 0.15.0
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: card-mod-list
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - '='
62
62
  - !ruby/object:Gem::Version
63
- version: 0.14.2
63
+ version: 0.15.0
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - '='
69
69
  - !ruby/object:Gem::Version
70
- version: 0.14.2
70
+ version: 0.15.0
71
+ - !ruby/object:Gem::Dependency
72
+ name: card-mod-integrate
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.15.0
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '='
83
+ - !ruby/object:Gem::Version
84
+ version: 0.15.0
85
+ - !ruby/object:Gem::Dependency
86
+ name: card-mod-edit
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '='
90
+ - !ruby/object:Gem::Version
91
+ version: 0.15.0
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '='
97
+ - !ruby/object:Gem::Version
98
+ version: 0.15.0
71
99
  description: ''
72
100
  email:
73
101
  - info@decko.org
@@ -76,6 +104,9 @@ extensions: []
76
104
  extra_rdoc_files: []
77
105
  files:
78
106
  - README.md
107
+ - assets/style/account.scss
108
+ - data/real.yml
109
+ - db/migrate_core_cards/20220815112551_move_roles.rb
79
110
  - locales/de.yml
80
111
  - locales/en.yml
81
112
  - set/abstract/account_field.rb
@@ -89,6 +120,7 @@ files:
89
120
  - set/right/roles.rb
90
121
  - set/right/salt.rb
91
122
  - set/right/status.rb
123
+ - set/self/role.rb
92
124
  - set/self/signin.rb
93
125
  - set/type/role.rb
94
126
  - set/type/signup.rb
@@ -96,6 +128,7 @@ files:
96
128
  - set/type/signup/views.rb
97
129
  - set/type/user.rb
98
130
  - set/type/user/setup_help.haml
131
+ - set/type_plus_right/role/members.rb
99
132
  - set/type_plus_right/user/email.rb
100
133
  homepage: https://decko.org
101
134
  licenses:
@@ -107,6 +140,7 @@ metadata:
107
140
  wiki_uri: https://decko.org
108
141
  documentation_url: http://docs.decko.org/
109
142
  card-mod: account
143
+ card-mod-group: gem-defaults
110
144
  post_install_message:
111
145
  rdoc_options: []
112
146
  require_paths:
@@ -122,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
156
  - !ruby/object:Gem::Version
123
157
  version: '0'
124
158
  requirements: []
125
- rubygems_version: 3.2.15
159
+ rubygems_version: 3.3.11
126
160
  signing_key:
127
161
  specification_version: 4
128
162
  summary: Email-based account handling for decko cards