@live-change/access-control-frontend 0.9.131 → 0.9.133

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.
@@ -1,4 +1,43 @@
1
1
  {
2
+ "access": {
3
+ "notAuthorized": "Not authorized",
4
+ "insufficientPrivileges": "You do not have sufficient privileges to use this feature of this object.",
5
+ "accessRequests": "Access Requests",
6
+ "accessInvitations": "Access Invitations",
7
+ "authorized": "Authorized",
8
+ "accessRequestSaved": "Access request saved",
9
+ "accessRequestDeleted": "Access Request Deleted",
10
+ "accessRequestAccepted": "Access Request accepted",
11
+ "confirmDeleteAccessRequest": "Do you want to delete user \"{name}\" access request?",
12
+ "accessInviteSaved": "Access invite saved",
13
+ "invitationDeleted": "Invitation Deleted",
14
+ "confirmDeleteInvitation": "Do you want to delete invitation for \"{name}\"?",
15
+ "accessSaved": "Access saved",
16
+ "accessRevoked": "Access Revoked",
17
+ "confirmRevokeAccess": "Do you want to revoke access for \"{name}\"?",
18
+ "publicAccessSaved": "Public access saved"
19
+ },
20
+ "invite": {
21
+ "inviteUserWithEmail": "Invite user with email",
22
+ "inviteWithEmail": "Invite with email",
23
+ "singleUser": "Single user",
24
+ "multipleUsers": "Multiple users",
25
+ "emailAddress": "Email address",
26
+ "emailAddressesMultiple": "Email addresses (newline or comma separated)",
27
+ "roles": "Roles",
28
+ "messageOptional": "Message ( optional )",
29
+ "inviteEmail": "Invite email",
30
+ "inviteEmails": "Invite emails",
31
+ "invitationSent": "Invitation sent!",
32
+ "invitationsWereSent": "Invitations were sent!",
33
+ "invitationWillBeSent": "Invitation will be sent!",
34
+ "inviteMultipleEmails": "Invite {count} emails",
35
+ "inviteSingleEmail": "Invite {email}"
36
+ },
37
+ "common": {
38
+ "rejected": "Rejected",
39
+ "rejectedDetail": "You have rejected"
40
+ },
2
41
  "notifications": {
3
42
  "types": {
4
43
  "accessControl_Invitation": {
@@ -0,0 +1,36 @@
1
+ {
2
+ "access": {
3
+ "notAuthorized": "Brak autoryzacji",
4
+ "insufficientPrivileges": "Nie masz wystarczających uprawnień do korzystania z tej funkcji tego obiektu.",
5
+ "accessRequests": "Prośby o dostęp",
6
+ "accessInvitations": "Zaproszenia dostępu",
7
+ "authorized": "Autoryzowani",
8
+ "accessRequestSaved": "Prośba o dostęp zapisana",
9
+ "accessRequestDeleted": "Prośba o dostęp usunięta",
10
+ "accessRequestAccepted": "Prośba o dostęp zaakceptowana",
11
+ "confirmDeleteAccessRequest": "Czy chcesz usunąć prośbę o dostęp użytkownika \"{name}\"?",
12
+ "accessInviteSaved": "Zaproszenie dostępu zapisane",
13
+ "publicAccessSaved": "Dostęp publiczny zapisany"
14
+ },
15
+ "invite": {
16
+ "inviteUserWithEmail": "Zaproś użytkownika przez email",
17
+ "inviteWithEmail": "Zaproś przez email",
18
+ "singleUser": "Jeden użytkownik",
19
+ "multipleUsers": "Wielu użytkowników",
20
+ "emailAddress": "Adres email",
21
+ "emailAddressesMultiple": "Adresy email (oddzielone nową linią lub przecinkiem)",
22
+ "roles": "Role",
23
+ "messageOptional": "Wiadomość (opcjonalna)",
24
+ "inviteEmail": "Zaproś email",
25
+ "inviteEmails": "Zaproś emaile",
26
+ "invitationSent": "Zaproszenie wysłane!",
27
+ "invitationsWereSent": "Zaproszenia zostały wysłane!",
28
+ "invitationWillBeSent": "Zaproszenie zostanie wysłane!",
29
+ "inviteMultipleEmails": "Zaproś {count} emaili",
30
+ "inviteSingleEmail": "Zaproś {email}"
31
+ },
32
+ "common": {
33
+ "rejected": "Odrzucone",
34
+ "rejectedDetail": "Odrzuciłeś"
35
+ }
36
+ }
@@ -2,15 +2,17 @@
2
2
  <div class="flex items-start p-6 bg-pink-100 rounded-border border border-pink-300 mb-6">
3
3
  <i class="pi pi-times-circle text-pink-900 text-2xl mr-4" />
4
4
  <div class="mr-4">
5
- <div class="text-pink-900 font-medium text-xl mb-4 leading-none">Not authorized</div>
5
+ <div class="text-pink-900 font-medium text-xl mb-4 leading-none">{{ t('access.notAuthorized') }}</div>
6
6
  <p class="m-0 p-0 text-pink-700">
7
- You do not have sufficient privileges to use this feature of this object.
7
+ {{ t('access.insufficientPrivileges') }}
8
8
  </p>
9
9
  </div>
10
10
  </div>
11
11
  </template>
12
12
 
13
13
  <script setup>
14
+ import { useI18n } from 'vue-i18n'
15
+ const { t } = useI18n()
14
16
  </script>
15
17
 
16
18
  <style scoped>
@@ -3,7 +3,7 @@
3
3
  <div v-if="myRoles.length > 0">
4
4
 
5
5
  <div class="text-center">
6
- <Button label="Invite with email" icon="pi pi-envelope" class="p-button mb-6"
6
+ <Button :label="t('invite.inviteWithEmail')" icon="pi pi-envelope" class="p-button mb-6"
7
7
  @click="inviteDialog = true" :disabled="!canInvite" />
8
8
  </div>
9
9
 
@@ -114,6 +114,8 @@
114
114
  })
115
115
 
116
116
  import { computed, watch, ref, onMounted } from 'vue'
117
+ import { useI18n } from 'vue-i18n'
118
+ const { t } = useI18n()
117
119
 
118
120
  const isMounted = ref(false)
119
121
  onMounted(() => isMounted.value = true)
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div v-if="synchronizedAccessInvitations.length > 0" class="mb-6">
3
- <div class="text-surface-900 dark:text-surface-0 font-medium text-xl mb-2">Access Invitations</div>
3
+ <div class="text-surface-900 dark:text-surface-0 font-medium text-xl mb-2">{{ t('access.accessInvitations') }}</div>
4
4
  <div v-for="access of synchronizedAccessInvitations" :key="access.to"
5
5
  class="flex flex-row flex-wrap items-center">
6
6
  <div class="col-span-12 md:col-span-6 py-1">
@@ -44,6 +44,8 @@
44
44
  import { synchronized, synchronizedList } from "@live-change/vue3-components"
45
45
 
46
46
  import { computed, watch, ref, onMounted } from 'vue'
47
+ import { useI18n } from 'vue-i18n'
48
+ const { t } = useI18n()
47
49
 
48
50
  const { object, objectType, availableRoles, multiRole, disabled } = defineProps({
49
51
  object: {
@@ -94,7 +96,7 @@
94
96
  identifiers: { object, objectType },
95
97
  objectIdentifiers: ({ to, sessionOrUser, sessionOrUserType }) =>
96
98
  ({ accessInvitation: to, sessionOrUser, sessionOrUserType, object, objectType }),
97
- onSave: () => toast.add({ severity: 'info', summary: 'Access invite saved', life: 1500 }),
99
+ onSave: () => toast.add({ severity: 'info', summary: t('access.accessInviteSaved'), life: 1500 }),
98
100
  recursive: true
99
101
  })
100
102
  const synchronizedAccessInvitations = synchronizedAccessInvitationsList.value
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div v-if="synchronizedAccesses.length > 0" class="mb-6">
3
- <div class="text-surface-900 dark:text-surface-0 font-medium text-xl mb-2">Authorized</div>
3
+ <div class="text-surface-900 dark:text-surface-0 font-medium text-xl mb-2">{{ t('access.authorized') }}</div>
4
4
  <div v-for="access of synchronizedAccesses" :key="access.to"
5
5
  class="flex flex-row flex-wrap items-center">
6
6
  <div class="col-span-12 md:col-span-6 py-1">
@@ -47,6 +47,8 @@
47
47
  import { synchronized, synchronizedList } from "@live-change/vue3-components"
48
48
 
49
49
  import { computed, watch, ref, onMounted } from 'vue'
50
+ import { useI18n } from 'vue-i18n'
51
+ const { t } = useI18n()
50
52
 
51
53
  const { object, objectType, availableRoles, multiRole, disabled } = defineProps({
52
54
  object: {
@@ -97,7 +99,7 @@
97
99
  identifiers: { object, objectType },
98
100
  objectIdentifiers: ({ to, sessionOrUser, sessionOrUserType }) =>
99
101
  ({ access: to, sessionOrUser, sessionOrUserType, object, objectType }),
100
- onSave: () => toast.add({ severity: 'info', summary: 'Access saved', life: 1500 }),
102
+ onSave: () => toast.add({ severity: 'info', summary: t('access.accessSaved'), life: 1500 }),
101
103
  recursive: true
102
104
  })
103
105
  const synchronizedAccesses = synchronizedAccessesList.value
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div v-if="synchronizedAccessRequests.length > 0" class="mb-6">
3
- <div class="text-surface-900 dark:text-surface-0 font-medium text-xl mb-2">Access Requests</div>
3
+ <div class="text-surface-900 dark:text-surface-0 font-medium text-xl mb-2">{{ t('access.accessRequests') }}</div>
4
4
  <div v-for="access of synchronizedAccessRequests" :key="access.to"
5
5
  class="flex flex-row flex-wrap items-center">
6
6
  <div class="col-span-12 md:col-span-6 py-1">
@@ -51,6 +51,8 @@
51
51
  import { synchronized, synchronizedList } from "@live-change/vue3-components"
52
52
 
53
53
  import { computed, watch, ref, onMounted } from 'vue'
54
+ import { useI18n } from 'vue-i18n'
55
+ const { t } = useI18n()
54
56
 
55
57
  const { object, objectType, availableRoles, multiRole, disabled } = defineProps({
56
58
  object: {
@@ -106,7 +108,7 @@
106
108
  identifiers: { object, objectType },
107
109
  objectIdentifiers: ({ to, sessionOrUser, sessionOrUserType }) =>
108
110
  ({ accessRequest: to, sessionOrUser, sessionOrUserType, object, objectType }),
109
- onSave: () => toast.add({ severity: 'info', summary: 'Access request saved', life: 1500 }),
111
+ onSave: () => toast.add({ severity: 'info', summary: t('access.accessRequestSaved'), life: 1500 }),
110
112
  recursive: true
111
113
  })
112
114
  const synchronizedAccessRequests = synchronizedAccessRequestsList.value
@@ -115,16 +117,16 @@
115
117
  console.log("DELETE ACCESS REQUEST", accessRequest)
116
118
  confirm.require({
117
119
  target: event.currentTarget,
118
- message: `Do you want to delete user "${accessRequest.identification.name}" access request?`,
120
+ message: t('access.confirmDeleteAccessRequest', { name: accessRequest.identification.name }),
119
121
  icon: 'pi pi-info-circle',
120
122
  acceptClass: 'p-button-danger',
121
123
  accept: async () => {
122
124
  await synchronizedAccessRequestsList.delete(accessRequest)
123
125
  //accessRequest.delete()
124
- toast.add({ severity:'info', summary: 'Access Request Deleted', life: 1500 })
126
+ toast.add({ severity:'info', summary: t('access.accessRequestDeleted'), life: 1500 })
125
127
  },
126
128
  reject: () => {
127
- toast.add({ severity:'error', summary: 'Rejected', detail: 'You have rejected', life: 3000 })
129
+ toast.add({ severity:'error', summary: t('common.rejected'), detail: t('common.rejectedDetail'), life: 3000 })
128
130
  }
129
131
  })
130
132
  }
@@ -134,7 +136,7 @@
134
136
  await accessControlApi.acceptAccessRequest({
135
137
  ...accessRequest, access: accessRequest.to
136
138
  })
137
- toast.add({ severity:'info', summary: 'Access Request accepted', life: 1500 })
139
+ toast.add({ severity:'info', summary: t('access.accessRequestAccepted'), life: 1500 })
138
140
  }
139
141
 
140
142
  </script>
@@ -67,6 +67,8 @@
67
67
  }
68
68
 
69
69
  import { computed, watch, ref, onMounted } from 'vue'
70
+ import { useI18n } from 'vue-i18n'
71
+ const { t } = useI18n()
70
72
 
71
73
  const {
72
74
  object, objectType,
@@ -135,7 +137,7 @@
135
137
  update: accessControlApi.setOrUpdatePublicAccess,
136
138
  identifiers: { object, objectType },
137
139
  recursive: true,
138
- onSave: () => toast.add({ severity: 'info', summary: 'Public access saved', life: 1500 })
140
+ onSave: () => toast.add({ severity: 'info', summary: t('access.publicAccessSaved'), life: 1500 })
139
141
  }).value
140
142
 
141
143
  </script>
@@ -3,7 +3,7 @@
3
3
  :modal="true" class="w-full sm:w-9/12 md:w-8/12 lg:w-6/12">
4
4
  <template #header>
5
5
  <div class="flex flex-wrap w-full">
6
- <div class="text-xl">Invite user with email</div>
6
+ <div class="text-xl">{{ t('invite.inviteUserWithEmail') }}</div>
7
7
  </div>
8
8
  </template>
9
9
 
@@ -13,13 +13,13 @@
13
13
 
14
14
  <Tabs v-model:value="tabIndex" class="w-full">
15
15
  <TabList>
16
- <Tab value="0">Single user</Tab>
17
- <Tab value="1">Multiple users</Tab>
16
+ <Tab value="0">{{ t('invite.singleUser') }}</Tab>
17
+ <Tab value="1">{{ t('invite.multipleUsers') }}</Tab>
18
18
  </TabList>
19
19
  <TabPanels>
20
20
  <TabPanel value="0">
21
21
 
22
- <command-form service="accessControl" action="inviteEmail"
22
+ <command-form service="accessControl" action="inviteEmail"
23
23
  ref="inviteForm"
24
24
  v-slot="{ data }"
25
25
  :parameters="{ objectType, object }"
@@ -30,7 +30,7 @@
30
30
  <div class="col-span-12 md:col-span-6 mb-2">
31
31
  <div class="p-field">
32
32
  <label for="email" class="block text-surface-900 dark:text-surface-0 font-medium mb-2">
33
- Email address
33
+ {{ t('invite.emailAddress') }}
34
34
  </label>
35
35
  <InputText id="email" type="text" class="w-full"
36
36
  aria-describedby="email-help" :invalid="!!data.emailError"
@@ -43,7 +43,7 @@
43
43
  <div class="col-span-12 md:col-span-6 mb-2">
44
44
  <div class="p-field ">
45
45
  <label for="inviteAccess" class="block text-surface-900 dark:text-surface-0 font-medium mb-2">
46
- Roles
46
+ {{ t('invite.roles') }}
47
47
  </label>
48
48
  <Dropdown v-if="!multiRole" id="inviteAccess" class="w-14em w-full"
49
49
  :options="['none'].concat(availableRoles)"
@@ -64,7 +64,7 @@
64
64
  </div>
65
65
  <div class="p-field">
66
66
  <label for="inviteMessage" class="block text-surface-900 dark:text-surface-0 font-medium mb-2">
67
- Message ( optional )
67
+ {{ t('invite.messageOptional') }}
68
68
  </label>
69
69
  <Textarea id="inviteMessage" v-model="data.message" :autoResize="true" rows="3" class="w-full" />
70
70
  </div>
@@ -83,7 +83,7 @@
83
83
 
84
84
  <div class="p-field mb-4">
85
85
  <label for="email" class="block text-surface-900 dark:text-surface-0 font-medium mb-2">
86
- Email addresses (newline or comma separated)
86
+ {{ t('invite.emailAddressesMultiple') }}
87
87
  </label>
88
88
  <Textarea id="emailsText" type="text" class="w-full"
89
89
  rows="4"
@@ -95,7 +95,7 @@
95
95
  </div>
96
96
  <div class="p-field mb-4">
97
97
  <label for="inviteAccess" class="block text-surface-900 dark:text-surface-0 font-medium mb-2">
98
- Roles
98
+ {{ t('invite.roles') }}
99
99
  </label>
100
100
  <Dropdown v-if="!multiRole" id="inviteAccess" class="w-14em w-full"
101
101
  :options="['none'].concat(availableRoles)"
@@ -114,7 +114,7 @@
114
114
  </div>
115
115
  <div class="p-field mb-1">
116
116
  <label for="inviteMessage" class="block text-surface-900 dark:text-surface-0 font-medium mb-2">
117
- Message ( optional )
117
+ {{ t('invite.messageOptional') }}
118
118
  </label>
119
119
  <Textarea id="inviteMessage" v-model="data.message" :autoResize="true" rows="3" class="w-full" />
120
120
  </div>
@@ -137,10 +137,10 @@
137
137
  </WorkingZone>
138
138
 
139
139
  <template #footer>
140
- <Button v-if="tabIndex === 0"
141
- label="Invite email" icon="pi pi-envelope" autofocus @click="inviteForm.submit()" />
140
+ <Button v-if="tabIndex == 0"
141
+ :label="t('invite.inviteEmail')" icon="pi pi-envelope" autofocus @click="inviteForm.submit()" />
142
142
  <Button v-else
143
- label="Invite emails" icon="pi pi-envelope" autofocus @click="inviteManyForm.submit()" />
143
+ :label="t('invite.inviteEmails')" icon="pi pi-envelope" autofocus @click="inviteManyForm.submit()" />
144
144
  </template>
145
145
 
146
146
 
@@ -214,7 +214,7 @@
214
214
  const inviteForm = ref()
215
215
  function handleInvited({ parameters, result }) {
216
216
  visible.value = false
217
- toast.add({ severity: 'success', summary: 'Invitation sent!', life: 1500 })
217
+ toast.add({ severity: 'success', summary: t('invite.invitationSent'), life: 1500 })
218
218
  console.log("INVITED", arguments)
219
219
  }
220
220
 
@@ -225,19 +225,19 @@
225
225
  if(!tmv) {
226
226
  inviteTask.value = null
227
227
  visible.value = false
228
- toast.add({ severity: 'success', summary: 'Invitations were sent!', life: 1500 })
228
+ toast.add({ severity: 'success', summary: t('invite.invitationsWereSent'), life: 1500 })
229
229
  }
230
230
  })
231
231
 
232
232
  const taskTypes = {
233
233
  inviteManyEmail: {
234
234
  label(task) {
235
- return 'Invite ' + task.properties.contacts.length + ' emails'
235
+ return t('invite.inviteMultipleEmails', { count: task.properties.contacts.length })
236
236
  }
237
237
  },
238
238
  inviteEmail: {
239
239
  label(task) {
240
- return 'Invite '+ task.properties.email
240
+ return t('invite.inviteSingleEmail', { email: task.properties.email })
241
241
  }
242
242
  }
243
243
  }
@@ -248,7 +248,7 @@
248
248
  const { task } = result
249
249
  inviteTask.value = task
250
250
  taskModalVisible.value = true
251
- toast.add({ severity: 'info', summary: 'Invitation will be sent!', life: 1500 })
251
+ toast.add({ severity: 'info', summary: t('invite.invitationWillBeSent'), life: 1500 })
252
252
  }
253
253
 
254
254
  </script>
package/index.js CHANGED
@@ -20,5 +20,6 @@ import configurationRoutes from "./front/src/configuration/routes.js"
20
20
  export { inviteRoutes, configurationRoutes }
21
21
 
22
22
  import en from "./front/locales/en.json"
23
- const locales = { en }
23
+ import pl from "./front/locales/pl.json"
24
+ const locales = { en, pl }
24
25
  export { locales }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@live-change/access-control-frontend",
3
- "version": "0.9.131",
3
+ "version": "0.9.133",
4
4
  "scripts": {
5
5
  "memDev": "node server/start.js memDev --enableSessions --initScript ./init.js --dbAccess",
6
6
  "localDevInit": "rm tmp.db; lcli localDev --enableSessions --initScript ./init.js",
@@ -21,22 +21,22 @@
21
21
  },
22
22
  "type": "module",
23
23
  "dependencies": {
24
- "@live-change/access-control-service": "^0.9.131",
25
- "@live-change/cli": "^0.9.131",
26
- "@live-change/dao": "^0.9.131",
27
- "@live-change/dao-vue3": "^0.9.131",
28
- "@live-change/dao-websocket": "^0.9.131",
29
- "@live-change/db-admin": "^0.9.131",
30
- "@live-change/framework": "^0.9.131",
31
- "@live-change/frontend-base": "^0.9.131",
32
- "@live-change/password-authentication-service": "^0.9.131",
33
- "@live-change/secret-code-service": "^0.9.131",
34
- "@live-change/secret-link-service": "^0.9.131",
35
- "@live-change/session-service": "^0.9.131",
36
- "@live-change/user-frontend": "^0.9.131",
37
- "@live-change/user-service": "^0.9.131",
38
- "@live-change/vue3-components": "^0.9.131",
39
- "@live-change/vue3-ssr": "^0.9.131",
24
+ "@live-change/access-control-service": "^0.9.133",
25
+ "@live-change/cli": "^0.9.133",
26
+ "@live-change/dao": "^0.9.133",
27
+ "@live-change/dao-vue3": "^0.9.133",
28
+ "@live-change/dao-websocket": "^0.9.133",
29
+ "@live-change/db-admin": "^0.9.133",
30
+ "@live-change/framework": "^0.9.133",
31
+ "@live-change/frontend-base": "^0.9.133",
32
+ "@live-change/password-authentication-service": "^0.9.133",
33
+ "@live-change/secret-code-service": "^0.9.133",
34
+ "@live-change/secret-link-service": "^0.9.133",
35
+ "@live-change/session-service": "^0.9.133",
36
+ "@live-change/user-frontend": "^0.9.133",
37
+ "@live-change/user-service": "^0.9.133",
38
+ "@live-change/vue3-components": "^0.9.133",
39
+ "@live-change/vue3-ssr": "^0.9.133",
40
40
  "@vueuse/core": "^12.3.0",
41
41
  "codeceptjs-assert": "^0.0.5",
42
42
  "compression": "^1.7.5",
@@ -53,7 +53,7 @@
53
53
  "vue3-scroll-border": "0.1.7"
54
54
  },
55
55
  "devDependencies": {
56
- "@live-change/codeceptjs-helper": "^0.9.131",
56
+ "@live-change/codeceptjs-helper": "^0.9.133",
57
57
  "codeceptjs": "^3.6.10",
58
58
  "generate-password": "1.7.1",
59
59
  "playwright": "1.49.1",
@@ -64,5 +64,5 @@
64
64
  "author": "Michał Łaszczewski <michal@laszczewski.pl>",
65
65
  "license": "BSD-3-Clause",
66
66
  "description": "",
67
- "gitHead": "3431deb86db4b740bcf04375b274697e0669fff4"
67
+ "gitHead": "455a7c9d204a89196f6599c42acd8eaeb45532e1"
68
68
  }