Compare commits

...

1483 commits

Author SHA1 Message Date
HJ
96a24ec625 Merge branch 'fix-discoverable-setting' into 'develop'
fix "allow discovery" setting misbehaving

See merge request pleroma/pleroma-fe!1518
2022-04-29 07:56:18 +00:00
Henry Jameson
91f833d1f0 fix "allow discovery" setting misbehaving 2022-04-29 10:52:16 +03:00
HJ
92b04ba7df Merge branch 'fix-chat-errors' into 'develop'
fix some chat errors/warnings that sometimes happen

See merge request pleroma/pleroma-fe!1515
2022-04-20 17:27:01 +00:00
Henry Jameson
895eda3714 fix some chat errors/warnings that sometimes happen 2022-04-20 20:19:22 +03:00
HJ
fb63e81ed1 Merge branch 'from/develop/tusooa/1157-popover-trigger' into 'develop'
Fix incorrect close of a status popover when clicking Expand inside it

Closes #1157

See merge request pleroma/pleroma-fe!1514
2022-04-20 09:15:18 +00:00
Tusooa Zhu
a4ea0a30bf
Fix incorrect close of a status popover when clicking Expand inside it
basically Vue (3 in particular?) will make changes to DOM before this event
listener is called, and if the target is displayed using v-if, it will not
be part of the DOM at that time, and contains() will return false. so it
goes to call hidePopover() which caused this bug.
2022-04-19 20:24:24 -04:00
HJ
1041a38f14 Merge branch 'fix-hashtags' into 'develop'
fix hashtags by explicitly putting attributes

See merge request pleroma/pleroma-fe!1513
2022-04-12 16:09:33 +00:00
Henry Jameson
0bb69d7fe0 fix tests 2022-04-12 19:04:32 +03:00
Henry Jameson
d175e86901 fix hashtags by explicitly putting attributes 2022-04-12 18:10:19 +03:00
HJ
c2a4051d72 Merge branch 'from/develop/tusooa/cropper-close' into 'develop'
Fix image cropper not closing correctly

See merge request pleroma/pleroma-fe!1512
2022-04-10 17:40:52 +00:00
Tusooa Zhu
169d13680a
Fix image cropper not closing correctly 2022-04-10 13:02:45 -04:00
HJ
4d15cbcbbd Merge branch 'from/develop/tusooa/1158-hidden-tabs' into 'develop'
Fix tab switcher not working when some tabs hidden

Closes #1158

See merge request pleroma/pleroma-fe!1511
2022-04-10 06:32:41 +00:00
Tusooa Zhu
3b02566e16
Fix tab switcher not working when some tabs hidden 2022-04-09 23:50:29 -04:00
HJ
87311cff09 Merge branch 'from/develop/tusooa/mobile-nav-link-col' into 'develop'
Fix mobile nav link text colour

See merge request pleroma/pleroma-fe!1510
2022-04-07 21:12:17 +00:00
Tusooa Zhu
6951fda0d6
Fix mobile nav link text colour 2022-04-07 15:59:03 -04:00
HJ
2d99cbc640 Merge branch 'from/develop/tusooa/1160-rm-shrug' into 'develop'
Fix shrug text in muted status

Closes #1160

See merge request pleroma/pleroma-fe!1509
2022-04-07 15:50:51 +00:00
Tusooa Zhu
22c70ae22a
Fix shrug text in muted status 2022-04-07 11:45:23 -04:00
HJ
d8324dd80b Merge branch 'from/develop/tusooa/shoutbox-icon-paneltext' into 'develop'
Use panel text instead of text for shoutbox icon

See merge request pleroma/pleroma-fe!1508
2022-04-07 07:24:40 +00:00
HJ
caacaf238c Merge branch 'from/develop/tusooa/popover-in-panel-style' into 'develop'
Fix popover in panel header styling

See merge request pleroma/pleroma-fe!1507
2022-04-07 07:24:22 +00:00
HJ
e4b8aaece6 Merge branch 'from/develop/tusooa/fix-shout-local' into 'develop'
Fix phoenix sockets in dev mode

See merge request pleroma/pleroma-fe!1506
2022-04-07 07:23:06 +00:00
HJ
bfc7b6af8f Merge branch 'from/develop/tusooa/1156-vue3-shoutbox' into 'develop'
Fix no reactivity on vuex 4 values

Closes #1156

See merge request pleroma/pleroma-fe!1505
2022-04-07 07:01:09 +00:00
Tusooa Zhu
fce9c5eeb2
Fix active popover style 2022-04-06 22:50:46 -04:00
Tusooa Zhu
6de87e8b65
Use panel text instead of text for shoutbox icon 2022-04-06 20:30:23 -04:00
Tusooa Zhu
041c72b07c
Fix dropdown menu style inside panel header 2022-04-06 20:14:17 -04:00
Tusooa Zhu
741a59e0cc
Fix phoenix sockets in dev mode
phoenix requires the Origin header to be set to the actual address,
so "http://localhost:xxxx" will not work.
2022-04-06 18:52:16 -04:00
Tusooa Zhu
4ddb6189dc
Fix no reactivity on vuex 4 values 2022-04-06 17:17:47 -04:00
HJ
0e56ac1c2b Merge branch 'fix-csp-vue3' into 'develop'
Makes develop usable on stock PleromaBE

See merge request pleroma/pleroma-fe!1504
2022-04-06 15:48:33 +00:00
Henry Jameson
853f5145be fix tegulu 2022-04-06 18:43:47 +03:00
Henry Jameson
b213d25711 heck 2022-04-06 15:48:07 +03:00
Henry Jameson
bd77f3a1a6 fix i18n for good?? 2022-04-06 15:45:44 +03:00
Henry Jameson
78817e37f7 force runtime build of i18n 2022-04-06 11:43:30 +03:00
Henry Jameson
2b0dd2cbae fix CSP by compiling the i18n templates as well 2022-04-05 23:45:26 +03:00
HJ
a613447105 Merge branch 'from/develop/tusooa/phoenix-1.6.2' into 'develop'
Fix phoenix at 1.6.2

See merge request pleroma/pleroma-fe!1502
2022-04-01 13:03:13 +00:00
Tusooa Zhu
a3233e31d0
Fix phoenix at 1.6.2
According to https://github.com/phoenixframework/phoenix/issues/4623 ,
1.6.2 seems to not have the disconnection bug.
2022-04-01 08:44:18 -04:00
HJ
f71f101fce Merge branch 'vue3-again' into 'develop'
Migration to Vue 3 (again)

See merge request pleroma/pleroma-fe!1385
2022-03-31 17:45:29 +00:00
HJ
afdc61b9b7 Merge branch 'vue3-no-compat' into 'vue3-again'
Remove Vue3 compat build

See merge request pleroma/pleroma-fe!1500
2022-03-31 17:39:08 +00:00
HJ
1d1ea7e703 Merge branch 'from/develop/tusooa/fix-feat-shoutbox-en' into 'develop'
Fix English translation of Shoutbox in features panel

See merge request pleroma/pleroma-fe!1489
2022-03-30 21:40:19 +00:00
Henry Jameson
052ad2fe3f Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  oops
2022-03-30 23:54:21 +03:00
Henry Jameson
a0099ecb66 oops 2022-03-30 23:54:11 +03:00
Henry Jameson
9940739f1f Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  fix some mishaps i noticed during self-review
2022-03-30 23:52:24 +03:00
Henry Jameson
afbe1a96ac fix some mishaps i noticed during self-review 2022-03-30 23:48:06 +03:00
Henry Jameson
e029c2864f Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  fix importer
2022-03-30 18:00:48 +03:00
Henry Jameson
dadf2f407f fix importer 2022-03-30 18:00:37 +03:00
Henry Jameson
6751c22a23 Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  make all clickable icons into actual buttons
2022-03-30 13:13:41 +03:00
Henry Jameson
1943991077 make all clickable icons into actual buttons 2022-03-30 12:34:27 +03:00
Henry Jameson
115170f35d Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  fix emoji input warning spam
  fix error clear icon
  Add controlledShowingLongSubject and toggle in StatusContent props
2022-03-30 01:26:35 +03:00
Henry Jameson
c3690b456e fix emoji input warning spam 2022-03-30 01:24:53 +03:00
Henry Jameson
70593e71e6 fix error clear icon 2022-03-30 01:24:17 +03:00
HJ
1c60609547 Merge branch 'vue3-again' into 'vue3-again'
Add controlledShowingLongSubject and toggle in StatusContent props

See merge request pleroma/pleroma-fe!1499
2022-03-29 18:13:27 +00:00
Tusooa Zhu
b84acfd7b7
Add controlledShowingLongSubject and toggle in StatusContent props 2022-03-29 13:56:42 -04:00
Henry Jameson
97e072d93a how did this get back?? 2022-03-29 20:23:44 +03:00
Henry Jameson
2179054384 Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  fix warning about custom component
  fix?
  fix some issues with trees
  removing uselsess stuff
  fix reset buttons in profile again
  fix spacing in poll expiration label
  registration fixes
2022-03-29 20:00:59 +03:00
Henry Jameson
a3f48fc3f4 fix warning about custom component 2022-03-29 19:55:30 +03:00
Henry Jameson
de2f968645 fix? 2022-03-29 19:44:07 +03:00
Henry Jameson
e1483488c7 fix some issues with trees 2022-03-29 19:23:30 +03:00
Henry Jameson
a1822f073d removing uselsess stuff 2022-03-29 19:21:13 +03:00
Henry Jameson
218b15b5fd fix reset buttons in profile again 2022-03-29 19:12:57 +03:00
Henry Jameson
bc029b0fa2 fix spacing in poll expiration label 2022-03-29 19:04:01 +03:00
Henry Jameson
2d7f242713 remove unused props to fix test 2022-03-29 16:33:34 +03:00
Henry Jameson
0afc955ebd registration fixes 2022-03-29 16:08:57 +03:00
Henry Jameson
e80e53d9d2 Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  re-fix i18n warnings again
  fix qr code
2022-03-29 16:00:56 +03:00
Henry Jameson
afcfcce2e6 re-fix i18n warnings again 2022-03-29 15:46:21 +03:00
Henry Jameson
3171241c6f fix qr code 2022-03-29 15:44:42 +03:00
Henry Jameson
3e0bb91ff2 Merge branch 'vue3-again' into vue3-no-compat
* vue3-again:
  lint + fixes for registration
  fix production build's reply not working in tree mode
  lock down version?
  manual lint
  Revert "fix weird thing i somehow missed"
  Revert "lint"
  fix weird thing i somehow missed
  lint
2022-03-29 15:35:47 +03:00
Henry Jameson
5bbc0e0bb5 lint + fixes for registration 2022-03-29 15:35:18 +03:00
Henry Jameson
3799983d4f fix production build's reply not working in tree mode 2022-03-29 12:43:42 +03:00
Henry Jameson
3f04ebd89a lock down version? 2022-03-29 12:27:59 +03:00
Henry Jameson
b93e5437bd manual lint 2022-03-29 12:04:09 +03:00
Henry Jameson
64d56e6515 Revert "fix weird thing i somehow missed"
This reverts commit b132581b3a.
2022-03-29 11:59:00 +03:00
Henry Jameson
d9d4d8954e Revert "lint"
This reverts commit f20ae34400.
2022-03-29 11:57:54 +03:00
Henry Jameson
b132581b3a fix weird thing i somehow missed 2022-03-29 11:47:22 +03:00
Henry Jameson
f20ae34400 lint 2022-03-29 01:04:37 +03:00
Henry Jameson
dc8bef7928 remove compat build 2022-03-29 00:58:17 +03:00
Henry Jameson
650e69c336 fix misc warnings 2022-03-29 00:02:02 +03:00
Henry Jameson
f21dc21a83 properly implement resettableAsyncComponent 2022-03-28 23:55:57 +03:00
Henry Jameson
9afbb12f95 fix opacity control again 2022-03-28 23:55:11 +03:00
Henry Jameson
7b10e47b21 rename some binding hooks according to new names 2022-03-28 23:54:30 +03:00
Henry Jameson
4b630c3c36 fix warnings 2022-03-28 17:37:26 +03:00
Henry Jameson
bdd240a230 fix some more warnings 2022-03-28 17:21:42 +03:00
Henry Jameson
c57af7e242 remove some warnings 2022-03-28 17:13:48 +03:00
Henry Jameson
f706234d77 fix being unable to set/reset background (and possibly avatar/banner) 2022-03-28 15:01:34 +03:00
Henry Jameson
805615d52b fix background not showing 2022-03-28 14:26:50 +03:00
Henry Jameson
8424b772b0 fix tabs in search 2022-03-27 14:43:16 +03:00
Henry Jameson
115f38c422 fix optional color inputs 2022-03-27 14:20:55 +03:00
Henry Jameson
48fd8a66ad fix opacity control 2022-03-27 14:18:02 +03:00
Henry Jameson
53cde52027 fix font control 2022-03-27 14:16:23 +03:00
Henry Jameson
75f6506bc7 fix (You) spacing 2022-03-27 14:10:45 +03:00
Henry Jameson
1d77063a4b fix shadow control in theme tab 2022-03-27 13:45:02 +03:00
Henry Jameson
ccd7378347 fix (roundness) ranges in theme tab 2022-03-27 13:31:56 +03:00
Henry Jameson
8e711e0587 get rid of portal-vue 2022-03-27 12:59:15 +03:00
Henry Jameson
87d420a92b port !1488 to vue3 2022-03-27 12:58:28 +03:00
Henry Jameson
d6bbccdd71 Merge remote-tracking branch 'origin/develop' into vue3-again
* origin/develop:
  Remove debugging code
  Fix overlapping buttons in Theme settings
  Update dependency ruffle-mirror to v2021.12.31
  Update dependency babel-loader to v8.2.4
2022-03-27 12:50:00 +03:00
Henry Jameson
913749739f fix user-list-popover 2022-03-27 12:29:28 +03:00
Henry Jameson
0b7a8dca15 fix duplicate setting (most likely a merge issue) 2022-03-27 12:26:51 +03:00
Henry Jameson
dd4672dc9a fix opening directly to filtering tab not working 2022-03-27 12:24:38 +03:00
Henry Jameson
9ac7046521 Fix notices not disappearing on their own 2022-03-27 12:21:33 +03:00
Henry Jameson
e4c804fac0 fix another spacing issue 2022-03-27 12:03:31 +03:00
HJ
fd77c583bf Merge branch 'from/develop/tusooa/fix-overlap-button' into 'develop'
Fix overlapping buttons in Theme settings

See merge request pleroma/pleroma-fe!1488
2022-03-25 13:22:06 +00:00
HJ
b319c0c72b Remove debugging code 2022-03-25 13:17:22 +00:00
Tusooa Zhu
c5551e834b
Fix English translation of Shoutbox in features panel 2022-03-24 19:28:15 -04:00
Tusooa Zhu
e58422889b
Fix overlapping buttons in Theme settings 2022-03-24 18:03:13 -04:00
Henry Jameson
b7755314b1 fix forms closing in timelines 2022-03-24 14:09:25 +02:00
Henry Jameson
3fb647b34b fix minor renames 2022-03-24 13:50:22 +02:00
Henry Jameson
0eb9c019e4 woah ima stupid 2022-03-24 13:41:52 +02:00
HJ
aa0b2e0723 Merge branch 'renovate/ruffle-mirror-2021.x' into 'develop'
Update dependency ruffle-mirror to v2021.12.31

See merge request pleroma/pleroma-fe!1486
2022-03-24 10:10:03 +00:00
Henry Jameson
4539feed40 fix checkboxes, specifically the NSFW one 2022-03-24 11:41:39 +02:00
Pleroma Renovate Bot
20c14a1d99 Update dependency ruffle-mirror to v2021.12.31 2022-03-24 09:05:00 +00:00
Henry Jameson
9793002070 cleanup console log 2022-03-23 16:53:57 +02:00
Henry Jameson
01d8fa4e54 fix i18n at places 2022-03-23 16:32:53 +02:00
Henry Jameson
961ca3a71b fix all the spacings i could find 2022-03-23 16:15:05 +02:00
Henry Jameson
08811e5a27 fix spacings in notifications 2022-03-23 16:08:45 +02:00
Henry Jameson
a6fae395da fix dupe id 2022-03-23 16:05:53 +02:00
Henry Jameson
d690b88c1c fix animations 2022-03-23 15:53:36 +02:00
Henry Jameson
322ec8681a cleanup 2022-03-23 15:44:37 +02:00
HJ
e1bfa6fbd3 Merge branch 'renovate/babel-monorepo' into 'develop'
Update dependency babel-loader to v8.2.4

See merge request pleroma/pleroma-fe!1484
2022-03-23 13:04:33 +00:00
Pleroma Renovate Bot
db0e1a2534 Update dependency babel-loader to v8.2.4 2022-03-23 09:05:04 +00:00
Henry Jameson
d524e98348 fix capitalization (and localization of tooltips for scope icon) 2022-03-22 20:42:29 +02:00
Henry Jameson
7afa6c9f40 listeners aren't actually used 2022-03-22 20:22:28 +02:00
Henry Jameson
538903f9d8 fix selects in settings screen 2022-03-22 20:17:25 +02:00
Henry Jameson
c5a6f40dff fix tabs not being able to be "disabled" 2022-03-22 20:15:21 +02:00
Henry Jameson
b817e09ee8 fix avatars not opening inline card 2022-03-22 19:43:11 +02:00
Henry Jameson
6b5791fda6 fix other weird route 2022-03-22 19:20:12 +02:00
Henry Jameson
3250e59266 fix routes test 2022-03-22 18:56:54 +02:00
Henry Jameson
e5ae0671ce skip user profile test for now https://github.com/vuejs/test-utils/issues/1382 2022-03-22 18:56:39 +02:00
Henry Jameson
9d7a7e2019 fix emoji input tests 2022-03-22 18:22:23 +02:00
Henry Jameson
c2cf13fc00 fix richcontent and its tests 2022-03-22 18:22:23 +02:00
Henry Jameson
c3546ea856 fix tests running 2022-03-22 18:22:23 +02:00
Henry Jameson
edb66ecade fix mobile post button being too square 2022-03-22 16:39:27 +02:00
Henry Jameson
c6a4a0a320 Merge remote-tracking branch 'origin/develop' into vue3-again
* origin/develop:
  quick fix for alignment in avatars, juggling multiple branches is confusing
  fix even more issues with avatars
  Update dependency ora to v0.4.1
  Update dependency mini-css-extract-plugin to v0.12.0
  Update dependency karma-firefox-launcher to v1.3.0
  fix avatars in mobile view
2022-03-22 12:14:02 +02:00
HJ
6a31962ca0 Merge branch 'fix-avatars3' into 'develop'
quick fix for alignment in avatars

See merge request pleroma/pleroma-fe!1483
2022-03-22 10:03:17 +00:00
Henry Jameson
fa99abf106 quick fix for alignment in avatars, juggling multiple branches is confusing 2022-03-22 11:57:21 +02:00
HJ
9be06d9f71 Merge branch 'renovate/mini-css-extract-plugin-0.x' into 'develop'
Update dependency mini-css-extract-plugin to v0.12.0

See merge request pleroma/pleroma-fe!1480
2022-03-22 09:54:23 +00:00
HJ
966919874e Merge branch 'fix-avatars2' into 'develop'
fix even more issues with avatars

See merge request pleroma/pleroma-fe!1482
2022-03-22 09:53:13 +00:00
HJ
a253c95170 Merge branch 'develop' into 'fix-avatars2'
# Conflicts:
#   src/components/status/status.scss
2022-03-22 09:47:24 +00:00
Henry Jameson
c6e0dcf08e fix even more issues with avatars 2022-03-22 11:43:51 +02:00
HJ
0147226b3d Merge branch 'renovate/ora-0.x' into 'develop'
Update dependency ora to v0.4.1

See merge request pleroma/pleroma-fe!1481
2022-03-22 09:20:54 +00:00
HJ
1571053fba Merge branch 'renovate/karma-firefox-launcher-1.x' into 'develop'
Update dependency karma-firefox-launcher to v1.3.0

See merge request pleroma/pleroma-fe!1475
2022-03-22 09:20:11 +00:00
Pleroma Renovate Bot
623aa3d20d Update dependency ora to v0.4.1 2022-03-22 09:06:15 +00:00
Pleroma Renovate Bot
636a55e72d Update dependency mini-css-extract-plugin to v0.12.0 2022-03-22 09:06:08 +00:00
Pleroma Renovate Bot
304f871332 Update dependency karma-firefox-launcher to v1.3.0 2022-03-22 09:06:00 +00:00
HJ
2cd8a3ec8d Merge branch 'fix-mobile-avatars' into 'develop'
fix avatars in mobile view

See merge request pleroma/pleroma-fe!1479
2022-03-22 08:24:42 +00:00
Henry Jameson
971cec024c fix avatars in mobile view 2022-03-22 10:20:45 +02:00
Henry Jameson
7a17eb7fec fix selects 2022-03-21 22:01:08 +02:00
Henry Jameson
4cb14c257c fix expert mode checkbox not working 2022-03-21 21:34:55 +02:00
Henry Jameson
1187727b60 fix tabswitcher bugs 2022-03-21 21:29:51 +02:00
Henry Jameson
54fd7e2be6 Merge remote-tracking branch 'origin/develop' into vue3-again
* origin/develop:
  improve the looks of bot indicator
  fix bot indicator appearing on retweeter avatar
  Update dependency localforage to v1.10.0
  Update dependency http-proxy-middleware to v0.21.0
  Update dependency eslint-plugin-standard to v4.1.0
  Update dependency eslint-plugin-import to v2.25.4
  Update babel monorepo to v7.17.8
  Update dependency iso-639-1 to v2.1.13
  Update dependency express to v4.17.3
  Update dependency eslint-plugin-promise to v4.3.1
  Update dependency eslint-loader to v2.2.1
2022-03-21 21:09:48 +02:00
HJ
0ef58696bf Merge branch 'bot-indicator-fixes' into 'develop'
Bot indicator fixes

See merge request pleroma/pleroma-fe!1477
2022-03-21 19:04:21 +00:00
Henry Jameson
9478a462a7 improve the looks of bot indicator 2022-03-21 20:59:25 +02:00
Henry Jameson
4e2fd7baf9 fix bot indicator appearing on retweeter avatar 2022-03-21 20:39:56 +02:00
HJ
66fb3987d6 Merge branch 'renovate/localforage-1.x' into 'develop'
Update dependency localforage to v1.10.0

See merge request pleroma/pleroma-fe!1476
2022-03-21 18:27:24 +00:00
HJ
1e60a491c4 Merge branch 'renovate/eslint-plugin-standard-4.x' into 'develop'
Update dependency eslint-plugin-standard to v4.1.0

See merge request pleroma/pleroma-fe!1471
2022-03-21 18:26:27 +00:00
HJ
12ce58a5a0 Merge branch 'renovate/babel-monorepo' into 'develop'
Update babel monorepo to v7.17.8

See merge request pleroma/pleroma-fe!1469
2022-03-21 18:25:29 +00:00
HJ
2f24f3312d Merge branch 'renovate/http-proxy-middleware-0.x' into 'develop'
Update dependency http-proxy-middleware to v0.21.0

See merge request pleroma/pleroma-fe!1473
2022-03-21 18:24:02 +00:00
HJ
1cc35b6df8 Merge branch 'renovate/eslint-plugin-import-2.x' into 'develop'
Update dependency eslint-plugin-import to v2.25.4

See merge request pleroma/pleroma-fe!1468
2022-03-21 18:19:24 +00:00
Pleroma Renovate Bot
4f2be206df Update dependency localforage to v1.10.0 2022-03-21 18:16:34 +00:00
Pleroma Renovate Bot
6074ad67ab Update dependency http-proxy-middleware to v0.21.0 2022-03-21 18:16:06 +00:00
Pleroma Renovate Bot
c5cb76ac3b Update dependency eslint-plugin-standard to v4.1.0 2022-03-21 18:15:53 +00:00
Pleroma Renovate Bot
e4b010321d Update dependency eslint-plugin-import to v2.25.4 2022-03-21 18:15:39 +00:00
Pleroma Renovate Bot
5e4ff5de7c Update babel monorepo to v7.17.8 2022-03-21 18:15:22 +00:00
HJ
6b14b645be Merge branch 'renovate/eslint-loader-2.x' into 'develop'
Update dependency eslint-loader to v2.2.1

See merge request pleroma/pleroma-fe!1467
2022-03-21 18:13:00 +00:00
HJ
79258f61be Merge branch 'renovate/eslint-plugin-promise-4.x' into 'develop'
Update dependency eslint-plugin-promise to v4.3.1

See merge request pleroma/pleroma-fe!1470
2022-03-21 18:10:10 +00:00
HJ
3ea442667f Merge branch 'renovate/express-4.x' into 'develop'
Update dependency express to v4.17.3

See merge request pleroma/pleroma-fe!1472
2022-03-21 18:05:16 +00:00
HJ
6c120cc576 Merge branch 'renovate/iso-639-1-2.x' into 'develop'
Update dependency iso-639-1 to v2.1.13

See merge request pleroma/pleroma-fe!1474
2022-03-21 18:01:48 +00:00
Pleroma Renovate Bot
89d6e624f2 Update dependency iso-639-1 to v2.1.13 2022-03-21 09:07:38 +00:00
Pleroma Renovate Bot
060aa41f35 Update dependency express to v4.17.3 2022-03-20 09:05:19 +00:00
Pleroma Renovate Bot
67f5cf3c03 Update dependency eslint-plugin-promise to v4.3.1 2022-03-19 09:07:04 +00:00
Henry Jameson
5948d20f00 mutes and blocks tab works 2022-03-18 13:36:08 +02:00
Henry Jameson
b3ed29ff02 made withLoadMore work... sorta 2022-03-18 13:32:36 +02:00
Pleroma Renovate Bot
5d973df5bd Update dependency eslint-loader to v2.2.1 2022-03-18 09:04:52 +00:00
Henry Jameson
26bfbdc2ad fix sw compilation 2022-03-18 11:02:00 +02:00
Henry Jameson
50ea6dd142 Merge remote-tracking branch 'origin/develop' into vue3-again
* origin/develop:
  Update dependency cropperjs to v1.5.12
  Update dependency body-scroll-lock to v2.7.1
  Update babel monorepo
2022-03-18 10:59:28 +02:00
HJ
6f1d953642 Merge branch 'renovate/cropperjs-1.x' into 'develop'
Update dependency cropperjs to v1.5.12

See merge request pleroma/pleroma-fe!1465
2022-03-18 08:58:03 +00:00
HJ
86f1b88d79 Merge branch 'renovate/body-scroll-lock-2.x' into 'develop'
Update dependency body-scroll-lock to v2.7.1

See merge request pleroma/pleroma-fe!1464
2022-03-18 08:57:08 +00:00
HJ
4610b6e547 Merge branch 'renovate/babel-monorepo' into 'develop'
Update babel monorepo

See merge request pleroma/pleroma-fe!1462
2022-03-17 09:11:07 +00:00
Pleroma Renovate Bot
be02516776 Update dependency cropperjs to v1.5.12 2022-03-17 09:05:41 +00:00
Pleroma Renovate Bot
4e100b9ea2 Update dependency body-scroll-lock to v2.7.1 2022-03-17 09:05:34 +00:00
Pleroma Renovate Bot
8ae1f7e192 Update babel monorepo 2022-03-17 09:05:20 +00:00
Henry Jameson
fea0c91f74 bunp node version 2022-03-17 09:33:36 +02:00
Henry Jameson
051d51bcd9 fix suggest not working 2022-03-17 09:28:19 +02:00
Henry Jameson
5718c6491e fix selects being messed up 2022-03-17 09:06:05 +02:00
Henry Jameson
a97c07bfdf fix settings not persisting 2022-03-17 09:02:26 +02:00
Henry Jameson
d815f984fb fix i18n errors related to @ symbol 2022-03-17 08:53:45 +02:00
Henry Jameson
4993dc37e2 fix rich content not rendering stillimage nor links correctly 2022-03-17 08:53:45 +02:00
Henry Jameson
0671aa0dd0 fix tabswitcher 2022-03-17 08:53:45 +02:00
Henry Jameson
b62653c202 fix chat user titles 2022-03-17 08:37:01 +02:00
Henry Jameson
be4244acde fix some warnings 2022-03-17 08:35:19 +02:00
Henry Jameson
8311d4deba shit renders yo 2022-03-16 22:13:21 +02:00
Henry Jameson
e51144809f shit boots yo 2022-03-16 22:02:44 +02:00
Henry Jameson
cd4ad2df11 Merge remote-tracking branch 'origin/develop' into vue3-again
* origin/develop: (475 commits)
  Apply 1 suggestion(s) to 1 file(s)
  Update dependency @ungap/event-target to v0.2.3
  Update package.json
  fix broken icons after FA upgrade
  Update Font Awesome
  Update dependency webpack-dev-middleware to v3.7.3
  Update dependency vuelidate to v0.7.7
  Pin dependency @kazvmoe-infra/pinch-zoom-element to 1.2.0
  lint
  Make media modal buttons larger
  Add English translation for hide tooltip
  Add hide button to media modal
  Lint
  Prevent hiding media viewer if swiped over SwipeClick
  Fix webkit image blurs
  Fix video in media modal not displaying properly
  Add changelog for https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1403
  Remove image box-shadow in media modal
  Clean up debug code for image pinch zoom
  Bump @kazvmoe-infra/pinch-zoom-element to 1.2.0 on npm
  ...
2022-03-16 21:00:20 +02:00
HJ
b632d740c1 Merge branch 'expert-settings-and-serverside' into 'develop'
Expert settings and serverside settings + new defaults

See merge request pleroma/pleroma-fe!1438
2022-03-16 17:33:24 +00:00
HJ
123de8aad0 Apply 1 suggestion(s) to 1 file(s) 2022-03-16 17:02:09 +00:00
HJ
186078ae2a Merge branch 'renovate/ungap-event-target-0.x' into 'develop'
Update dependency @ungap/event-target to v0.2.3

See merge request pleroma/pleroma-fe!1463
2022-03-16 09:15:24 +00:00
Pleroma Renovate Bot
23c80794d5 Update dependency @ungap/event-target to v0.2.3 2022-03-16 09:05:13 +00:00
HJ
3e1415ef89 Merge branch 'hj-develop-patch-28607' into 'develop'
Fix build due to github shenanigans

See merge request pleroma/pleroma-fe!1461
2022-03-15 19:07:02 +00:00
HJ
2439f55342 Merge branch 'renovate/font-awesome' into 'develop'
Update Font Awesome

See merge request pleroma/pleroma-fe!1460
2022-03-15 19:03:44 +00:00
HJ
b0babee98a Update package.json 2022-03-15 19:02:34 +00:00
Henry Jameson
47bb08514b fix broken icons after FA upgrade 2022-03-15 21:00:52 +02:00
HJ
60eb164bdc Merge branch 'renovate/webpack-dev-middleware-3.x' into 'develop'
Update dependency webpack-dev-middleware to v3.7.3

See merge request pleroma/pleroma-fe!1459
2022-03-15 18:40:58 +00:00
Pleroma Renovate Bot
3101456a85 Update Font Awesome 2022-03-15 09:05:20 +00:00
Pleroma Renovate Bot
5e851e643b Update dependency webpack-dev-middleware to v3.7.3 2022-03-15 09:05:08 +00:00
HJ
bfa62db274 Merge branch 'renovate/pin-dependencies' into 'develop'
Pin dependency @kazvmoe-infra/pinch-zoom-element to 1.2.0

See merge request pleroma/pleroma-fe!1457
2022-03-15 08:22:33 +00:00
HJ
b349bcd427 Merge branch 'renovate/vuelidate-0.x' into 'develop'
Update dependency vuelidate to v0.7.7

See merge request pleroma/pleroma-fe!1458
2022-03-14 09:11:28 +00:00
Pleroma Renovate Bot
7e6e6292f8 Update dependency vuelidate to v0.7.7 2022-03-14 09:05:17 +00:00
Pleroma Renovate Bot
34592fa63a Pin dependency @kazvmoe-infra/pinch-zoom-element to 1.2.0 2022-03-14 09:05:10 +00:00
Henry Jameson
71c0b59866 lint 2022-03-14 09:35:29 +02:00
Henry Jameson
a97db1efd6 Merge remote-tracking branch 'origin/develop' into expert-settings-and-serverside
* origin/develop: (83 commits)
  Make media modal buttons larger
  Add English translation for hide tooltip
  Add hide button to media modal
  Lint
  Prevent hiding media viewer if swiped over SwipeClick
  Fix webkit image blurs
  Fix video in media modal not displaying properly
  Add changelog for https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1403
  Remove image box-shadow in media modal
  Clean up debug code for image pinch zoom
  Bump @kazvmoe-infra/pinch-zoom-element to 1.2.0 on npm
  Bump pinch-zoom-element version
  Clean up
  Check whether we swiped only for mouse pointer
  Scale swipe threshold with viewport width
  Update pinch-zoom-element
  Allow pinch-zoom to fill the whole screen
  Use native click for hiding overlay
  Reset position on swipe end even if we cannot navigate
  Make lint happy
  ...
2022-03-14 09:31:24 +02:00
HJ
e34d71fc1f Merge branch 'from/develop/tusooa/tree-threading' into 'develop'
Add the option to display threads as trees

See merge request pleroma/pleroma-fe!1407
2022-03-13 17:31:46 +00:00
HJ
89efb0d2f4 Merge branch 'from/develop/tusooa/media-touch-actions' into 'develop'
Be able to scroll and pan media in media modal

See merge request pleroma/pleroma-fe!1403
2022-03-13 17:22:30 +00:00
Tusooa Zhu
1b204012ea
Make media modal buttons larger 2022-03-13 12:02:03 -04:00
Tusooa Zhu
b67a557a8c
Add English translation for hide tooltip 2022-03-13 12:02:03 -04:00
Tusooa Zhu
5fb302d0f1
Add hide button to media modal 2022-03-13 12:02:02 -04:00
Tusooa Zhu
7e21853cca
Lint 2022-03-13 12:02:02 -04:00
Tusooa Zhu
7dd1a0dd30
Prevent hiding media viewer if swiped over SwipeClick 2022-03-13 12:02:02 -04:00
Tusooa Zhu
90b066a744
Fix webkit image blurs 2022-03-13 12:02:02 -04:00
Tusooa Zhu
1128cc463c
Fix video in media modal not displaying properly 2022-03-13 12:02:02 -04:00
Tusooa Zhu
22d8961c5e
Add changelog for https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1403 2022-03-13 12:02:02 -04:00
Tusooa Zhu
76727cd39c
Remove image box-shadow in media modal
The box-shadow causes an image to be very blurry on Webkit browsers
(experienced: Konqueror, Safari; heard of: Chrome) when scaled up
if the initial size of the image is much smaller than the actual size
(e.g. when viewing a very long picture).

The shadow is not really obvious anyway.
2022-03-13 12:02:02 -04:00
Tusooa Zhu
5829cd98af
Clean up debug code for image pinch zoom 2022-03-13 12:02:02 -04:00
Tusooa Zhu
49fa9c47e9
Bump @kazvmoe-infra/pinch-zoom-element to 1.2.0 on npm
https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1403
2022-03-13 12:02:00 -04:00
Tusooa Zhu
495960c83a
Bump pinch-zoom-element version 2022-03-13 12:00:45 -04:00
Tusooa Zhu
3b4afdf567
Clean up 2022-03-13 12:00:45 -04:00
Tusooa Zhu
a485ebc2bb
Check whether we swiped only for mouse pointer 2022-03-13 12:00:45 -04:00
Tusooa Zhu
6980e4ddf1
Scale swipe threshold with viewport width 2022-03-13 12:00:44 -04:00
Tusooa Zhu
cb19db1006
Update pinch-zoom-element 2022-03-13 12:00:44 -04:00
Tusooa Zhu
ddf6c9cef0
Allow pinch-zoom to fill the whole screen 2022-03-13 12:00:44 -04:00
Tusooa Zhu
9f3a983fef
Use native click for hiding overlay
The pointerup strategy is unsuccessful, as some other overlays
(Firefox's Inspect Element) will pass down pointerup events.
2022-03-13 12:00:44 -04:00
Tusooa Zhu
839627ffc4
Reset position on swipe end even if we cannot navigate 2022-03-13 12:00:44 -04:00
Tusooa Zhu
f3269cdc10
Make lint happy 2022-03-13 12:00:44 -04:00
Tusooa Zhu
3502d374e3
Prevent the click event from firing on content below modal 2022-03-13 12:00:44 -04:00
Tusooa Zhu
0190a36070
Add missing swipe click component 2022-03-13 12:00:44 -04:00
Tusooa Zhu
23a6b86ef3
Clean up 2022-03-13 12:00:44 -04:00
Tusooa Zhu
29cd8fbd3b
Add swipe-click handler to media modal
Now swiping will correctly change the current media, and with a good
preview. Clicking without swiping closes the overlay.
2022-03-13 12:00:44 -04:00
Tusooa Zhu
a36673a6a8
Use pinch-zoom-element for pinch zoom functionality 2022-03-13 12:00:41 -04:00
Tusooa Zhu
544db06294
Add pan threshold 2022-03-13 11:56:35 -04:00
Tusooa Zhu
d9030b4fdd
Handle pinch action 2022-03-13 11:56:35 -04:00
Tusooa Zhu
a7570f5eb2
Preview swipe action 2022-03-13 11:56:34 -04:00
Tusooa Zhu
f96e5882d1
Make media modal be aware of multi-touch actions
Originally the media viewer would think every touch is a swipe (one-finger
touch event), so we would encounter the case where a two-finger scale event
would incorrectly change the current media. This is now fixed.
2022-03-13 11:56:30 -04:00
Henry Jameson
f16f35a4d4 Merge remote-tracking branch 'origin/develop' into expert-settings-and-serverside
* origin/develop:
  Update dependency v-click-outside to v2.1.5
  Update dependency shelljs to v0.8.5
  Update dependency portal-vue to v2.1.7
  Update dependency lodash to v4.17.21
  Update dependency karma-spec-reporter to v0.0.33
  Update dependency karma-webpack to v4.0.2
  Update dependency karma-sourcemap-loader to v0.3.8
  Update dependency eslint-plugin-vue to v5.2.3
  Update dependency chromedriver to v87.0.7
  Update dependency @chenfengyuan/vue-qrcode to v1.0.2
  Pin dependencies
  Pin dependencies
  Do not mute bot posts in notifications
  Lint
  Add renovate.json
  Add bot indication to user icon on statuses
  Mute bot posts
  fix placeholder attachments opening new tab
2022-03-13 16:34:05 +02:00
HJ
51b14cc615 Merge branch 'eientei' into 'develop'
Mute bot posts filtering option

See merge request pleroma/pleroma-fe!1440
2022-03-13 14:04:15 +00:00
HJ
80bd6433aa Merge branch 'renovate/shelljs-0.x' into 'develop'
Update dependency shelljs to v0.8.5

See merge request pleroma/pleroma-fe!1455
2022-03-13 10:20:28 +00:00
HJ
50b3a30d1a Merge branch 'renovate/v-click-outside-2.x' into 'develop'
Update dependency v-click-outside to v2.1.5

See merge request pleroma/pleroma-fe!1456
2022-03-13 09:32:59 +00:00
Henry Jameson
5930b667a1 reduce the copypaste by making it more functional-style 2022-03-13 11:30:38 +02:00
Pleroma Renovate Bot
9b5ae4d4a3 Update dependency v-click-outside to v2.1.5 2022-03-13 09:04:54 +00:00
Pleroma Renovate Bot
22c8ad4583 Update dependency shelljs to v0.8.5 2022-03-13 09:04:46 +00:00
Henry Jameson
726fdbea15 remove "experimental" label from streaming api 2022-03-13 10:51:13 +02:00
HJ
67c2b52682 Merge branch 'renovate/portal-vue-2.x' into 'develop'
Update dependency portal-vue to v2.1.7

See merge request pleroma/pleroma-fe!1452
2022-03-13 08:20:20 +00:00
HJ
238e557d2b Merge branch 'renovate/lodash-monorepo' into 'develop'
Update dependency lodash to v4.17.21

See merge request pleroma/pleroma-fe!1451
2022-03-13 08:19:32 +00:00
HJ
c8d87e7ef9 Merge branch 'renovate/karma-spec-reporter-0.x' into 'develop'
Update dependency karma-spec-reporter to v0.0.33

See merge request pleroma/pleroma-fe!1449
2022-03-12 09:30:01 +00:00
Pleroma Renovate Bot
a83b07a629 Update dependency portal-vue to v2.1.7 2022-03-12 09:07:30 +00:00
Pleroma Renovate Bot
3bd2f3c36d Update dependency lodash to v4.17.21 2022-03-12 09:07:19 +00:00
Pleroma Renovate Bot
465c5f194c Update dependency karma-spec-reporter to v0.0.33 2022-03-12 09:07:05 +00:00
HJ
ec3df8e5f2 Merge branch 'renovate/chromedriver-87.x' into 'develop'
Update dependency chromedriver to v87.0.7

See merge request pleroma/pleroma-fe!1446
2022-03-11 10:59:22 +00:00
HJ
c194568daf Merge branch 'renovate/eslint-plugin-vue-5.x' into 'develop'
Update dependency eslint-plugin-vue to v5.2.3

See merge request pleroma/pleroma-fe!1447
2022-03-11 10:59:08 +00:00
HJ
63039aea37 Merge branch 'renovate/chenfengyuan-vue-qrcode-1.x' into 'develop'
Update dependency @chenfengyuan/vue-qrcode to v1.0.2

See merge request pleroma/pleroma-fe!1445
2022-03-11 09:15:37 +00:00
HJ
fb803b2ff2 Merge branch 'renovate/karma-webpack-4.x' into 'develop'
Update dependency karma-webpack to v4.0.2

See merge request pleroma/pleroma-fe!1450
2022-03-11 09:13:27 +00:00
HJ
fabac8524d Merge branch 'renovate/karma-sourcemap-loader-0.x' into 'develop'
Update dependency karma-sourcemap-loader to v0.3.8

See merge request pleroma/pleroma-fe!1448
2022-03-11 09:12:42 +00:00
Pleroma Renovate Bot
35ad2a1957 Update dependency karma-webpack to v4.0.2 2022-03-11 09:06:09 +00:00
Pleroma Renovate Bot
e4d40fbba4 Update dependency karma-sourcemap-loader to v0.3.8 2022-03-11 09:05:47 +00:00
Pleroma Renovate Bot
d4076e5df5 Update dependency eslint-plugin-vue to v5.2.3 2022-03-11 09:05:34 +00:00
Pleroma Renovate Bot
2ced27e734 Update dependency chromedriver to v87.0.7 2022-03-11 09:05:21 +00:00
Pleroma Renovate Bot
04d4f5525c Update dependency @chenfengyuan/vue-qrcode to v1.0.2 2022-03-11 09:05:09 +00:00
HJ
949f11ea1e Merge branch 'renovate/pin-dependencies' into 'develop'
Pin dependencies

See merge request pleroma/pleroma-fe!1443
2022-03-10 09:14:32 +00:00
Pleroma Renovate Bot
00a5dfc36f Pin dependencies 2022-03-10 09:06:57 +00:00
HJ
e29f33ed0c Merge branch 'renovate/font-awesome' into 'develop'
Pin dependencies

See merge request pleroma/pleroma-fe!1444
2022-03-09 19:35:02 +00:00
Pleroma Renovate Bot
6946d09f55 Pin dependencies 2022-03-09 18:43:25 +00:00
Alexander Tumin
450145dd6b Do not mute bot posts in notifications 2022-03-09 07:56:43 +03:00
Tusooa Zhu
551b8f3690
Fix "max depth in thread" setting 2022-03-07 20:02:53 -05:00
Tusooa Zhu
48178bdc53
Make maxDepthInThread instance-default 2022-03-07 19:30:24 -05:00
Tusooa Zhu
a511250b63
Make $status-margin fallback only 2022-03-07 19:28:38 -05:00
Tusooa Zhu
415a823af0
Clean up dead code 2022-03-07 19:19:32 -05:00
Tusooa Zhu
0e323ef248
Add English translations for fading ancestor option 2022-03-07 19:19:32 -05:00
Tusooa Zhu
d157f67381
Make fading ancestors optional 2022-03-07 19:19:32 -05:00
Tusooa Zhu
fa20ea76b1
Update English translation for tree view settings 2022-03-07 19:19:32 -05:00
Tusooa Zhu
e7f5033c7d
Split conversation display style into two different settings
linear => linear (now default)
simple_tree => tree / conversationTreeAdvanced=false
tree => tree / conversationTreeAdvanced=true
2022-03-07 19:19:32 -05:00
Tusooa Zhu
9432fcec7d
Make 'Show full conversation' button have left border in embbeded mode 2022-03-07 19:19:32 -05:00
Tusooa Zhu
5768806d1b
Fix showingLongSubject not correctly propagated 2022-03-07 19:19:32 -05:00
Tusooa Zhu
f8c5cbcd0d
Fix timeline jump when scrolling
Ref: tree-threading
2022-03-07 19:19:31 -05:00
Tusooa Zhu
20880cdf0b
Make replying and mediaPlaying controlled
$refs is not a reliable way to deal with child components under
tree threading as it is not reactive, but the children may change at
any time. The only good way seems to be making these states aggregated on
the conversation component.

Ref: tree-threading
2022-03-07 19:19:31 -05:00
Tusooa Zhu
cc5cff2038
Clean up debug code for tree threading 2022-03-07 19:19:31 -05:00
Tusooa Zhu
2a510205c3
Fix virtual scrolling for tree threading
Ref: tree-threading
2022-03-07 19:19:31 -05:00
Tusooa Zhu
0db5a5a581
Fix controlled status display toggles 2022-03-07 19:19:31 -05:00
Tusooa Zhu
ba858a894c
Add English translations for other replies count 2022-03-07 19:19:31 -05:00
Tusooa Zhu
654996fdbe
Add other replies count for reply list link 2022-03-07 19:19:31 -05:00
Tusooa Zhu
cebb4224ac
Do not display replies inside status as link if there are no other replies 2022-03-07 19:19:31 -05:00
Tusooa Zhu
9b27ac9aaf
Add English translation for position of other replies button pref 2022-03-07 19:19:31 -05:00
Tusooa Zhu
863255d52f
Make position of other replies button a pref 2022-03-07 19:19:31 -05:00
Tusooa Zhu
c4bd004cbc
Add English translation for show all conversation button improvement 2022-03-07 19:19:31 -05:00
Tusooa Zhu
244174a32b
Improve "show full conversation" interaction
Now we only show that button when there are other statuses out of sight
(other toplevel statuses exist outside of the current thread tree).
2022-03-07 19:19:31 -05:00
Tusooa Zhu
22bdcda9c0
Make other replies button stretch along the row 2022-03-07 19:19:31 -05:00
Tusooa Zhu
ba8598858b
Optimise thread ancestor borders 2022-03-07 19:19:31 -05:00
Tusooa Zhu
17863f54fe
Optimise thread ancestor display style 2022-03-07 19:19:31 -05:00
Tusooa Zhu
26670e9003
Reset thread open state when collapsed 2022-03-07 19:19:30 -05:00
Tusooa Zhu
10cd03c718
Clean up 2022-03-07 19:19:30 -05:00
Tusooa Zhu
f1db5e8f4b
Highlight ancestor of the current status when diving back to top 2022-03-07 19:19:30 -05:00
Tusooa Zhu
d78c8e8ea4
Add English translation for Misskey-style tree view 2022-03-07 19:19:30 -05:00
Tusooa Zhu
e560fbc935
Implement Misskey-style tree view
Now the tree will be always rooted at the highlighted status, and
all its ancestors shown linearly on the top.

Enhancement: If an ancestor has more
than one reply (i.e. it has a child that is not on current status's
ancestor chain), we are given a link to root the thread at that status.
2022-03-07 19:19:30 -05:00
Tusooa Zhu
4adffb4835
Remove horizontal border and thicken vertical border in a thread tree 2022-03-07 19:19:30 -05:00
Tusooa Zhu
0e4a7c3d05
Make dive/undive button clickable along the whole row 2022-03-07 19:19:30 -05:00
Tusooa Zhu
8780246ce5
Optimize thread border radius 2022-03-07 19:19:30 -05:00
Tusooa Zhu
61bb69c88f
Optimize thread display 2022-03-07 19:19:30 -05:00
Tusooa Zhu
bdf631c2c4
Fix the bug where toggleShowingTall does not work 2022-03-07 19:19:30 -05:00
Tusooa Zhu
3addc36c96
Fix status undefined in parentOf 2022-03-07 19:19:30 -05:00
Tusooa Zhu
f851bc92c9
Add English translations for max depth in thread 2022-03-07 19:19:30 -05:00
Tusooa Zhu
2e54cf12c7
Add settings for max depth in thread 2022-03-07 19:19:30 -05:00
Tusooa Zhu
ff5f69b8fd
Use mergedConfig properly 2022-03-07 19:19:30 -05:00
Tusooa Zhu
d7da9f80a7
Fallback to simpleTree style 2022-03-07 19:19:30 -05:00
Tusooa Zhu
6b990ba368
Undive when collapsed 2022-03-07 19:19:29 -05:00
Tusooa Zhu
cd3e6d0073
Clean up 2022-03-07 19:19:29 -05:00
Tusooa Zhu
0aaef50ee5
Lint 2022-03-07 19:19:29 -05:00
Tusooa Zhu
05b2351e08
Add English translation for simple tree 2022-03-07 19:19:29 -05:00
Tusooa Zhu
d9a9f97751
Add simple tree style navigation 2022-03-07 19:19:29 -05:00
Tusooa Zhu
8c0deb905e
Add English translation for diving 2022-03-07 19:19:29 -05:00
Tusooa Zhu
d15d24c11c
Add dive functionality 2022-03-07 19:19:29 -05:00
Tusooa Zhu
31c4300456
Add English translations for diving 2022-03-07 19:19:29 -05:00
Tusooa Zhu
84a3cd92a3
Support diving into one status in a conversation 2022-03-07 19:19:29 -05:00
Tusooa Zhu
ace1f5067c
Make status display controlled 2022-03-07 19:19:29 -05:00
Tusooa Zhu
cd0f6a4f78
Add English translations for message threading 2022-03-07 19:19:29 -05:00
Tusooa Zhu
414ee55957
Make show full thread message account for numbers 2022-03-07 19:19:29 -05:00
Tusooa Zhu
0f2fd8a352
Implement thread folding/expanding 2022-03-07 19:19:29 -05:00
Tusooa Zhu
0582f19e7c
Add tree-style thread display 2022-03-07 19:19:29 -05:00
HJ
7e1e8ea429 Merge branch 'from/develop/tusooa/fix-lint-2' into 'develop'
Lint

See merge request pleroma/pleroma-fe!1442
2022-03-06 19:35:05 +00:00
Tusooa Zhu
7a8c975f61
Lint 2022-03-06 14:22:59 -05:00
HJ
1e41c2b99e Merge branch 'renovate/configure' into 'develop'
Configure Renovate

See merge request pleroma/pleroma-fe!1441
2022-03-06 18:25:05 +00:00
Pleroma Renovate Bot
f0f1066bc8 Add renovate.json 2022-03-06 17:50:32 +00:00
Alexander Tumin
2b7f12613e Add bot indication to user icon on statuses 2022-03-01 01:00:38 +03:00
Alexander Tumin
fe0ed7e8f0 Mute bot posts 2022-02-28 23:14:45 +03:00
HJ
514d7d3f88 Merge branch 'fix-hidden-attachments' into 'develop'
fix placeholder attachments opening new tab

Closes #1139

See merge request pleroma/pleroma-fe!1439
2022-02-28 17:46:58 +00:00
Henry Jameson
77b55a559b fix placeholder attachments opening new tab 2022-02-28 19:42:02 +02:00
Henry Jameson
77bb0b5530 lint 2022-02-28 18:23:32 +02:00
Henry Jameson
39909c8a85 pre-emptively wipe serverside settings on logout 2022-02-28 18:17:13 +02:00
Henry Jameson
f4b36a9ebf fix errors in choicesetting 2022-02-28 18:15:21 +02:00
Henry Jameson
67319d0e5b fix typos in profile page 2022-02-28 18:15:07 +02:00
Henry Jameson
cf58df17f6 hidden away more settings when logged out 2022-02-28 18:04:13 +02:00
Henry Jameson
8bb97fbfeb fix settings behaving erratically and not updating properly 2022-02-28 18:01:41 +02:00
Henry Jameson
3a5ad18aca fix stripping rich content not working 2022-02-28 18:00:38 +02:00
Henry Jameson
e3d602fdcc revert changes related to streaming/firehose setting, reword it so it's
not confused with websocket streaming
2022-02-28 17:45:07 +02:00
Henry Jameson
c07c0b2260 fix firefox rendering (??????????) 2022-02-28 17:43:08 +02:00
Henry Jameson
f626da838a revert to using local setting for default nsfw since backend is broken 2022-02-24 15:00:08 +02:00
Henry Jameson
9623b0e140 better phrasing 2022-02-24 14:41:55 +02:00
Henry Jameson
b1b9260a1d new defaults 2022-02-22 23:32:12 +02:00
Henry Jameson
9c1814d122 expert settings toggle + server-side settings 2022-02-22 23:31:40 +02:00
HJ
0300db6c63 Merge branch 'from/develop/tusooa/media-modal-counter-i18n' into 'develop'
Make media modal counter go through i18n

See merge request pleroma/pleroma-fe!1436
2022-02-21 16:15:16 +00:00
Tusooa Zhu
c7690aecd0
Add English translation for media modal counter 2022-02-21 10:34:20 -05:00
Tusooa Zhu
1b32bb9c51
Make media modal counter go through i18n 2022-02-21 10:33:47 -05:00
HJ
9bc7d99e16 Merge branch 'hj-develop-patch-74637' into 'develop'
Update changelog

See merge request pleroma/pleroma-fe!1435
2022-02-21 14:23:11 +00:00
HJ
965bc5573f Update CHANGELOG.md 2022-02-21 14:17:28 +00:00
HJ
2559d03d7e Update CHANGELOG.md 2022-02-21 14:16:45 +00:00
HJ
58d0f9678b Merge branch 'fix-mentions-new-bugs' into 'develop'
Fix newfound bugs with rich mentions + user suggestions

See merge request pleroma/pleroma-fe!1430
2022-02-20 15:11:52 +00:00
HJ
ddee8bb686 Merge branch 'proper-attachments' into 'develop'
Attachment improvements

See merge request pleroma/pleroma-fe!1399
2022-02-20 15:11:33 +00:00
HJ
56616787ec Merge branch 'fix-pinned-statuses' into 'develop'
Fix pinned statuses appearing at the bottom of user timeline

Closes #1112

See merge request pleroma/pleroma-fe!1433
2022-02-20 15:11:08 +00:00
HJ
d3659b5597 Merge branch 'fix-1133' into 'develop'
fix #1133

Closes #1133

See merge request pleroma/pleroma-fe!1434
2022-02-20 14:12:20 +00:00
Henry Jameson
373c30be69 fix #1133 2022-02-20 16:06:26 +02:00
Henry Jameson
7b60adb480 only for user TL 2022-02-20 00:57:31 +02:00
Henry Jameson
5864dc52f7 removed file because that logic has been removed 2022-02-20 00:43:38 +02:00
Henry Jameson
a31ff20f50 lol, lmao, that was some shit, this is much easier and works all the time 2022-02-20 00:36:21 +02:00
Henry Jameson
2a97bdb39d fix pinned statuses appearing at the bottom of user timeline (and
possibly fetching new ones there)
2022-02-20 00:04:47 +02:00
Henry Jameson
86e3aefdab new unit tests 2022-02-19 23:04:51 +02:00
Henry Jameson
a8d1987686 fix unit tests 2022-02-19 22:40:19 +02:00
Henry Jameson
0d073d607c enable link handling in user bios to fix links not having _blank 2022-02-19 22:34:08 +02:00
Henry Jameson
769a9a14fe add emoji to chat titles 2022-02-19 22:30:13 +02:00
Henry Jameson
a61f6e1590 use rich content in interaction lists 2022-02-19 22:12:37 +02:00
Henry Jameson
ee86f56469 more spacing fixes 2022-02-11 15:10:52 +02:00
Henry Jameson
17d6f1b53b more spacing fixes 2022-02-11 15:06:12 +02:00
Henry Jameson
befd4d5fc7 improve unknown attachment handling 2022-02-10 15:42:28 +02:00
Henry Jameson
4c7edfc9a9 more spacing/wrapping fixes 2022-02-09 23:34:26 +02:00
Henry Jameson
d361a4d7dc fix overflows 2022-02-04 14:20:56 +02:00
Henry Jameson
571e73a346 better approach to unescaping 2022-02-03 23:13:28 +02:00
Henry Jameson
39ecb33883 fix amps in links 2022-02-03 22:58:12 +02:00
Henry Jameson
0f01931309 make chat messages behave same as posts for animated gifs 2022-02-03 22:52:41 +02:00
Henry Jameson
a9830ff491 support width/height img attributes 2022-02-03 22:50:32 +02:00
Henry Jameson
9a6363431d lint 2022-02-03 22:41:38 +02:00
Henry Jameson
ea6114f63c better phrasing? 2022-02-03 22:36:13 +02:00
Henry Jameson
bfb3a4364b options to disable (You)s and highlighting of yourself 2022-02-03 22:34:57 +02:00
Henry Jameson
6d3229b1a1 fix poast mentions tripping 2022-02-03 22:23:28 +02:00
Henry Jameson
06042569f1 fix alignment issues 2022-02-03 22:10:45 +02:00
HJ
8ade11783a Merge branch 'from/develop/tusooa/1118-enhanced-mention-link' into 'develop'
Enhanced mention link

Closes #1118

See merge request pleroma/pleroma-fe!1424
2022-02-03 19:37:13 +00:00
HJ
a5e20a4eb2 Merge branch 'from/develop/tusooa/fix-follow-list' into 'develop'
Fix Follow button missing on follow list

See merge request pleroma/pleroma-fe!1428
2022-02-03 10:22:22 +00:00
HJ
dd75e43c57 Merge branch 'from/develop/tusooa/fix-lint-warn' into 'develop'
Fix lint warning in filtering_tab.vue

See merge request pleroma/pleroma-fe!1429
2022-02-03 10:22:04 +00:00
Tusooa Zhu
0e6af68a0f
Fix lint warning in filtering_tab.vue 2022-02-02 21:35:17 -05:00
Tusooa Zhu
f886135bb7
Fix Follow button missing on follow list 2022-02-02 21:30:52 -05:00
Tusooa Zhu
c3f1765b21
Hide mention link avatar by default 2022-01-29 16:57:59 -05:00
Tusooa Zhu
7cc0d0763c
Add English translation for mention link prefs 2022-01-29 16:57:59 -05:00
Tusooa Zhu
c8983d5606
Make mention link prefs ui more intuitive 2022-01-29 16:57:59 -05:00
Tusooa Zhu
0c60b31eee
Add option to fade domains in mention link 2022-01-29 16:57:59 -05:00
Tusooa Zhu
aaf0b985ad
Make avatar unselectable 2022-01-29 16:57:59 -05:00
Tusooa Zhu
9fde13c968
Add option to display user avatar in mention link 2022-01-29 16:57:59 -05:00
Tusooa Zhu
8896afd8d8
Make (You) unselectable 2022-01-29 16:57:59 -05:00
Tusooa Zhu
95007059d1
Style properly usernames without tooltips 2022-01-29 16:57:59 -05:00
Tusooa Zhu
1d4b1b296e
Add pref for whether to display full user names and tooltips 2022-01-29 16:57:59 -05:00
Tusooa Zhu
76547fe66d
Add a pref for whether to display mention as icon or text 2022-01-29 16:57:59 -05:00
Henry Jameson
d1f02221cb changelog 2022-01-24 21:44:41 +02:00
Henry Jameson
efd558f394 Merge remote-tracking branch 'origin/develop' into proper-attachments
* origin/develop:
  Update CHANGELOG.md
2022-01-24 21:38:08 +02:00
HJ
28ee5721bb Merge branch 'hj-develop-patch-16931' into 'develop'
Update CHANGELOG.md

See merge request pleroma/pleroma-fe!1427
2022-01-24 19:31:42 +00:00
Henry Jameson
94c37e8adf Merge remote-tracking branch 'origin/develop' into proper-attachments
* origin/develop:
  undo accidental change when merging
  Apply 1 suggestion(s) to 1 file(s)
  Rearranged settings, moved more stuff to filtering where apllicable. Changed how filering works.
2022-01-24 21:29:19 +02:00
HJ
e5f731c97d Update CHANGELOG.md 2022-01-24 19:29:01 +00:00
HJ
3cf7f9e3c8 Merge branch 'settings-and-filtering' into 'develop'
Settings rearrange and filtering improvements

See merge request pleroma/pleroma-fe!1394
2022-01-24 18:18:27 +00:00
Henry Jameson
56de3d2f52 fix too-many-attachments in notifications column 2022-01-24 19:53:17 +02:00
Henry Jameson
c551e3e697 Merge remote-tracking branch 'origin/develop' into proper-attachments
* origin/develop: (81 commits)
  Improve the user card for deactivated users
  Update CHANGELOG.md
  Update CHANGELOG.md
  Allow canceling a follow request
  Simple policy reasons for instance specific policies
  entity_normalizer: Escape name when parsing user
  Translated using Weblate (Spanish)
  Translated using Weblate (Catalan)
  Translated using Weblate (Korean)
  Translated using Weblate (Japanese (ja_PEDANTIC))
  Translated using Weblate (Indonesian)
  Translated using Weblate (Esperanto)
  Translated using Weblate (Vietnamese)
  Translated using Weblate (Italian)
  Translated using Weblate (Vietnamese)
  Translated using Weblate (Indonesian)
  Translated using Weblate (Italian)
  Translated using Weblate (Vietnamese)
  Translated using Weblate (Indonesian)
  Translated using Weblate (Chinese (Simplified))
  ...
2022-01-24 19:28:38 +02:00
Henry Jameson
f7e2ac1c48 undo accidental change when merging 2022-01-24 19:16:03 +02:00
Henry Jameson
2f8aae371b Merge remote-tracking branch 'origin/settings-and-filtering' into settings-and-filtering
* origin/settings-and-filtering:
  Apply 1 suggestion(s) to 1 file(s)
2022-01-24 19:13:29 +02:00
Henry Jameson
9ea0f10abb Merge remote-tracking branch 'origin/develop' into settings-and-filtering
* origin/develop: (169 commits)
  Improve the user card for deactivated users
  Update CHANGELOG.md
  Update CHANGELOG.md
  Allow canceling a follow request
  Simple policy reasons for instance specific policies
  entity_normalizer: Escape name when parsing user
  Translated using Weblate (Spanish)
  Translated using Weblate (Catalan)
  Translated using Weblate (Korean)
  Translated using Weblate (Japanese (ja_PEDANTIC))
  Translated using Weblate (Indonesian)
  Translated using Weblate (Esperanto)
  Translated using Weblate (Vietnamese)
  Translated using Weblate (Italian)
  Translated using Weblate (Vietnamese)
  Translated using Weblate (Indonesian)
  Translated using Weblate (Italian)
  Translated using Weblate (Vietnamese)
  Translated using Weblate (Indonesian)
  Translated using Weblate (Chinese (Simplified))
  ...
2022-01-24 19:12:17 +02:00
HJ
182fcca5da Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1413
2022-01-19 13:10:16 +00:00
HJ
6509542dbd Merge branch 'fixes_for_deactivated_profile' into 'develop'
Improve the user card for deactivated users

See merge request pleroma/pleroma-fe!1417
2022-01-19 13:09:49 +00:00
Ilja
2ac78219ee Improve the user card for deactivated users 2022-01-19 13:09:48 +00:00
Shpuld Shpludson
756f7bf7c2 Merge branch 'shpuld-develop-patch-58245' into 'develop'
Update CHANGELOG.md

See merge request pleroma/pleroma-fe!1423
2022-01-09 18:29:46 +00:00
Shpuld Shpludson
4cd27acf7f Update CHANGELOG.md 2022-01-09 18:26:35 +00:00
Shpuld Shpludson
030c374def Merge branch 'shpuld-develop-patch-87791' into 'develop'
Update CHANGELOG.md

See merge request pleroma/pleroma-fe!1422
2022-01-09 18:21:14 +00:00
Shpuld Shpludson
056f5f547a Update CHANGELOG.md 2022-01-09 18:16:44 +00:00
HJ
af2a408b78 Apply 1 suggestion(s) to 1 file(s) 2022-01-09 17:59:50 +00:00
HJ
d22e04eaf6 Merge branch 'allow_to_cancel_follow_request' into 'develop'
Allow canceling a follow request

See merge request pleroma/pleroma-fe!1416
2021-12-28 11:43:24 +00:00
Ilja
4587f37dd7 Allow canceling a follow request
When a follow request is sent, but not (yet) accepted, the behaviour is now to cancel the request instead of re sending.

The reason is double
* You couldn't cancel a follow request if you change your mind and the request wasn't answered yet
* Instances don't always correctly process a new follow request when the following is already happening. If something went wrong (e;g. the target server thinks you're following, but your instance thinks you're not yet), it's better to first sent an unfollow. This is the behaviour that Mastodon and most probably most other clients have. Therefore this flow is more tested and expected by other instances.
2021-12-12 18:09:21 +01:00
HJ
a20f1794d0 Merge branch 'simplePolicy_reasons_for_instance_specific_policies' into 'develop'
Simple policy reasons for instance specific policies

See merge request pleroma/pleroma-fe!1263
2021-12-03 18:14:32 +00:00
Ilja
b4cfda4a20 Simple policy reasons for instance specific policies 2021-12-03 18:14:32 +00:00
HJ
ea0887a15e Merge branch 'fix/escape-display-name' into 'develop'
entity_normalizer: Escape name when parsing user

See merge request pleroma/pleroma-fe!1415
2021-11-16 17:45:14 +00:00
rinpatch
d36b45ad43 entity_normalizer: Escape name when parsing user
In January 2020 Pleroma backend stopped escaping HTML in display names
and passed that responsibility on frontends, compliant with Mastodon's
version of Mastodon API [1]. Pleroma-FE was subsequently modified to
escape the display name [2], however only in the "name_html" field. This
was fine however, since that's what the code rendering display names used.

However, 2 months ago an MR [3] refactoring the way the frontend does emoji
and mention rendering was merged. One of the things it did was moving away
from doing emoji rendering in the entity normalizer and use the unescaped
'user.name' in the rendering code, resulting in HTML injection being
possible again.

This patch escapes 'user.name' as well, as far as I can tell there is no
actual use for an unescaped display name in frontend code, especially
when it comes from MastoAPI, where it is not supposed to be HTML.

[1]: https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1052
[2]: https://git.pleroma.social/pleroma/pleroma/-/merge_requests/2167
[3]: https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1392
2021-11-16 20:35:23 +03:00
tarteka
d2730d5bad Translated using Weblate (Spanish)
Currently translated at 100.0% (722 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-10-21 19:22:22 +00:00
retiolus
1c75c74c91 Translated using Weblate (Catalan)
Currently translated at 99.7% (720 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2021-09-29 00:45:54 +00:00
Ryo Ueno
ef684dff61 Translated using Weblate (Korean)
Currently translated at 61.9% (447 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2021-09-19 09:45:49 +00:00
Ryo Ueno
241b4957e1 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 99.4% (718 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-09-19 09:45:49 +00:00
@liimee
45eda03d1c Translated using Weblate (Indonesian)
Currently translated at 68.1% (492 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/id/
2021-09-16 00:45:47 +00:00
Tirifto
1d0e4bada8 Translated using Weblate (Esperanto)
Currently translated at 100.0% (722 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2021-09-14 15:45:47 +00:00
Hồ Nhất Duy
3c8ced53b9 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (722 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/vi/
2021-09-09 22:00:26 +00:00
Ben Is
80dd6b2500 Translated using Weblate (Italian)
Currently translated at 100.0% (722 of 722 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-09-09 22:00:26 +00:00
Hồ Nhất Duy
ad64b91d66 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/vi/
2021-09-09 22:00:26 +00:00
@liimee
4988268f5f Translated using Weblate (Indonesian)
Currently translated at 67.5% (484 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/id/
2021-09-09 22:00:26 +00:00
Ben Is
50adf0ddf2 Translated using Weblate (Italian)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-09-09 22:00:26 +00:00
HJ
ef5bbc4e5f Merge branch 'themeApply' into 'develop'
Minor QOL improvement: Theme tab Apply and Reset buttons shouldn't require scrolling

See merge request pleroma/pleroma-fe!1397
2021-09-09 22:00:20 +00:00
HJ
370f1e55ad Merge branch 'develop' into 'themeApply'
# Conflicts:
#   CHANGELOG.md
2021-09-09 21:51:39 +00:00
HJ
a8a82ad12f Merge branch 'showMobileNewPost' into 'develop'
New user option: Always show floating New Post button

See merge request pleroma/pleroma-fe!1395
2021-09-09 12:19:53 +00:00
HJ
1c53528433 Merge branch 'fix-favico-badge-chrome' into 'develop'
fix favico badge not working on chrome

See merge request pleroma/pleroma-fe!1391
2021-09-07 16:17:31 +00:00
HJ
8af1f08539 Merge branch 'better-still-emoji' into 'develop'
Status HTML parsing - better emoji and mentions rendering

Closes #935

See merge request pleroma/pleroma-fe!1392
2021-09-07 16:15:41 +00:00
Shpuld Shpludson
25a8b48bf2 Merge branch 'from/develop/tusooa/fix-mobile-shoutbox-display' into 'develop'
Fix mobile shoutbox display

See merge request pleroma/pleroma-fe!1404
2021-09-07 14:46:39 +00:00
HJ
59bab829a6 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1412
2021-09-05 12:31:23 +00:00
Hồ Nhất Duy
13468f2a89 Translated using Weblate (Vietnamese)
Currently translated at 50.0% (358 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/vi/
2021-09-05 04:46:01 +00:00
@liimee
5bb471a68e Translated using Weblate (Indonesian)
Currently translated at 67.3% (482 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/id/
2021-09-05 04:45:45 +00:00
Kana
ff5ed29ec1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-09-05 04:45:43 +00:00
tarteka
fa75a3a615 Translated using Weblate (Basque)
Currently translated at 80.7% (578 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2021-09-05 04:45:43 +00:00
HJ
057e3dac85 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1388
2021-09-02 16:58:11 +00:00
Hồ Nhất Duy
6e57170626 Added translation using Weblate (Vietnamese) 2021-09-02 14:47:32 +00:00
@liimee
98da3ad124 Translated using Weblate (Indonesian)
Currently translated at 60.6% (434 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/id/
2021-08-30 15:24:16 +00:00
@liimee
144cee6d34 Translated using Weblate (Indonesian)
Currently translated at 58.6% (420 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/id/
2021-08-30 15:24:16 +00:00
tarteka
0543c8d536 Translated using Weblate (Basque)
Currently translated at 80.4% (576 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2021-08-30 15:24:16 +00:00
marcin mikołajczak
9319666f04 Translated using Weblate (Polish)
Currently translated at 98.8% (708 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pl/
2021-08-30 15:24:16 +00:00
@liimee
ca9652b30b Translated using Weblate (Indonesian)
Currently translated at 56.9% (408 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/id/
2021-08-30 15:24:16 +00:00
tarteka
21af736fe1 Translated using Weblate (Basque)
Currently translated at 79.8% (572 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2021-08-30 15:24:16 +00:00
tarteka
78ba8be969 Translated using Weblate (Spanish)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-08-30 15:24:16 +00:00
@liimee
29f229daad Translated using Weblate (Indonesian)
Currently translated at 50.1% (359 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/id/
2021-08-30 15:24:16 +00:00
marcin mikołajczak
5049ee575f Translated using Weblate (Polish)
Currently translated at 98.7% (707 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pl/
2021-08-30 15:24:16 +00:00
tarteka
32ed71501a Translated using Weblate (Spanish)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-08-30 15:24:16 +00:00
@liimee
a7a736c7b8 Added translation using Weblate (Indonesian) 2021-08-30 15:24:16 +00:00
tarteka
5cbb71e588 Translated using Weblate (Spanish)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-08-30 15:24:16 +00:00
M. Strange
fa2e5deae2 Translated using Weblate (Catalan)
Currently translated at 97.4% (698 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2021-08-30 15:24:16 +00:00
titizen
a3bfa63d05 Translated using Weblate (Catalan)
Currently translated at 95.3% (683 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2021-08-30 15:24:16 +00:00
M. Strange
1ef2bb93fe Translated using Weblate (Catalan)
Currently translated at 92.0% (659 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2021-08-30 15:24:16 +00:00
titizen
c38ab7234d Translated using Weblate (Catalan)
Currently translated at 92.0% (659 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2021-08-30 15:24:16 +00:00
ZEN
791293c709 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-08-30 15:24:16 +00:00
M. Strange
8574db1cf1 Translated using Weblate (Catalan)
Currently translated at 56.1% (402 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2021-08-30 15:24:15 +00:00
Snow
90d553f4be Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-08-30 15:24:15 +00:00
Haelwenn (lanodan) Monnier
d3139a92b3 Translated using Weblate (French)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2021-08-30 15:24:15 +00:00
Ben Is
bc08f998cf Translated using Weblate (Italian)
Currently translated at 100.0% (716 of 716 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-08-30 15:24:15 +00:00
Tirifto
f72671a1aa Translated using Weblate (Esperanto)
Currently translated at 100.0% (715 of 715 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2021-08-30 15:24:15 +00:00
Ben Is
738e7923e4 Translated using Weblate (Italian)
Currently translated at 100.0% (715 of 715 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-08-30 15:24:15 +00:00
retiolus
b3f15fe3e1 Translated using Weblate (Catalan)
Currently translated at 44.4% (318 of 715 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2021-08-30 15:24:15 +00:00
ZEN
761f91f7ef Translated using Weblate (Ukrainian)
Currently translated at 100.0% (715 of 715 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-08-30 15:24:15 +00:00
Issabella Deinschnitzel
c509ed357a Translated using Weblate (German)
Currently translated at 100.0% (715 of 715 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-08-30 15:24:15 +00:00
Ben Is
18871684c7 Translated using Weblate (Italian)
Currently translated at 100.0% (715 of 715 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-08-30 15:24:15 +00:00
Kana
33e2bcce31 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (714 of 714 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-08-30 15:24:15 +00:00
Ben Is
4d529c13ba Translated using Weblate (Italian)
Currently translated at 100.0% (714 of 714 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-08-30 15:24:15 +00:00
Ben Is
0e53b2916e Translated using Weblate (Italian)
Currently translated at 100.0% (714 of 714 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-08-30 15:24:15 +00:00
Tirifto
04a49e4c42 Translated using Weblate (Esperanto)
Currently translated at 99.7% (709 of 711 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2021-08-30 15:24:15 +00:00
ZEN
f57f61ca53 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (711 of 711 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-08-30 15:24:15 +00:00
Ben Is
4302db5975 Translated using Weblate (Italian)
Currently translated at 100.0% (711 of 711 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-08-30 15:24:15 +00:00
Shpuld Shpludson
cdcefc2b73 Merge branch 'fix-ext-profile' into 'develop'
fix ext profile bug

See merge request pleroma/pleroma-fe!1409
2021-08-30 15:24:06 +00:00
Henry Jameson
4d73eaa6ce fix spacing before hashtags 2021-08-23 21:36:18 +03:00
Henry Jameson
39494439d3 very minimalist hashtaglink implementation, also you can middle-click
mentions now.
2021-08-23 20:57:21 +03:00
Henry Jameson
c3576211cb fix tests 2021-08-18 21:17:51 +03:00
Henry Jameson
cbb34e2b0e fix expanded mentions spacing 2021-08-18 20:58:26 +03:00
Henry Jameson
e98a2af39e hopefully final fix for spacings 2021-08-18 20:54:04 +03:00
Henry Jameson
dbdc5e050f fix ext profile bug 2021-08-16 01:41:52 +03:00
Henry Jameson
49fe334186 play gifs when hovering over notification 2021-08-16 01:34:35 +03:00
Henry Jameson
14ec7d6a41 add attachment counter 2021-08-16 01:11:43 +03:00
Henry Jameson
7cc19ef2ea better media modal loading 2021-08-16 01:11:42 +03:00
Henry Jameson
0507eb6550 ability to move attachments around when making a new post 2021-08-15 21:04:49 +03:00
Henry Jameson
830a03a0d1 inline description display 2021-08-15 21:04:28 +03:00
Henry Jameson
34d265467a add media description into media modal 2021-08-15 19:45:48 +03:00
Henry Jameson
f5823a96e9 add key attribute to make image refresh in media modal to give feedback
when images are still loaded
2021-08-15 19:43:52 +03:00
Henry Jameson
777f6c0162 Merge branch 'better-still-emoji' into proper-attachments
* better-still-emoji:
  fix "+X more" sticking
2021-08-15 18:43:52 +03:00
Henry Jameson
0087d33c75 fix "+X more" sticking 2021-08-15 18:41:13 +03:00
Henry Jameson
299c00cf74 fix video attachments in notifications not having pointer cursor 2021-08-15 18:35:26 +03:00
Henry Jameson
07c12ae162 replace poll with an icon in notifications 2021-08-15 18:26:37 +03:00
Henry Jameson
c8a7b6f433 fix long posts double-fading in notifications 2021-08-15 18:21:25 +03:00
Henry Jameson
5431d8fe55 Merge branch 'better-still-emoji' into proper-attachments
* better-still-emoji:
  fix links sticking to mentionsline
2021-08-15 18:11:57 +03:00
Henry Jameson
8cc1ad67df fix links sticking to mentionsline 2021-08-15 18:11:38 +03:00
Henry Jameson
6aa6f6f300 fix console errors 2021-08-15 17:53:35 +03:00
Henry Jameson
17d2eed06a Merge branch 'better-still-emoji' into proper-attachments
* better-still-emoji:
  fix tests
  prevent infinite update loops
  remove obsolete tests
  removed useless code, review change, fixed bug with tall statuses
  fixed mentions line again
  remove old emoji added, everything emoji-bearing uses RichContent now
  richcontent support in polls, user cards and user profiles
  support richcontent in polls
  fix tests, add performance test (skipped, doesn't assert anything), tweak max mentions count
  made the code responsible for showing unwritten mentions actually work
  remove new options for style and separate line, now groups all chained mentions on a mentionsline regardless of placement. fixes spacing
  fix tests
2021-08-15 16:27:41 +03:00
Henry Jameson
f16658adfc fix tests 2021-08-15 02:59:14 +03:00
Henry Jameson
68b4323181 prevent infinite update loops 2021-08-15 02:55:45 +03:00
Henry Jameson
7d67e8f1cc remove obsolete tests 2021-08-15 02:44:36 +03:00
Henry Jameson
530ac4442b removed useless code, review change, fixed bug with tall statuses 2021-08-15 02:41:53 +03:00
Henry Jameson
4465de5241 fixed mentions line again 2021-08-14 22:03:09 +03:00
Henry Jameson
97e86381c8 remove old emoji added, everything emoji-bearing uses RichContent now 2021-08-13 13:12:33 +03:00
Henry Jameson
4c974f5ca2 richcontent support in polls, user cards and user profiles 2021-08-13 13:06:42 +03:00
Henry Jameson
6c6df29ed3 support richcontent in polls 2021-08-13 12:19:57 +03:00
Henry Jameson
add5921b8b fix tests, add performance test (skipped, doesn't assert anything),
tweak max mentions count
2021-08-12 19:37:04 +03:00
Henry Jameson
2182af4058 made the code responsible for showing unwritten mentions actually work 2021-08-12 03:09:28 +03:00
Henry Jameson
2cfff1b8b9 remove new options for style and separate line, now groups all chained
mentions on a mentionsline regardless of placement. fixes spacing
2021-08-12 02:56:40 +03:00
Shpuld Shpludson
4686993334 Merge branch 'shpuld-develop-patch-10585' into 'develop'
Update CHANGELOG.md for 2.4.0

See merge request pleroma/pleroma-fe!1405
2021-08-08 12:47:25 +00:00
Shpuld Shpludson
435f80133a Update CHANGELOG.md for 2.4.0 2021-08-08 12:38:51 +00:00
Tusooa Zhu
ef277ae4e2
Fix mobile shoutbox 2021-08-03 20:11:06 -04:00
eris
f35e3d0f3f Fix merge conflict in CHANGELOG
# Conflicts:
#   CHANGELOG.md
2021-07-22 20:47:36 +00:00
eris
179af131ee Fix changelog merge conflict
# Conflicts:
#   CHANGELOG.md
2021-07-22 20:46:41 +00:00
Shpuld Shpludson
425919a0d2 Merge branch 'fix-themes-select' into 'develop'
Fix theme select not working

See merge request pleroma/pleroma-fe!1393
2021-07-19 18:33:19 +00:00
HJ
ba961b784f Apply 1 suggestion(s) to 1 file(s) 2021-07-19 17:10:13 +00:00
Shpuld Shpludson
891611816c Merge branch 'editProfile' into 'develop'
Minor change: Add edit profile button onto self user card

See merge request pleroma/pleroma-fe!1398
2021-07-19 16:35:28 +00:00
Shpuld Shpludson
373b14e1e4 Merge branch 'fix-settings-anon' into 'develop'
Fix Boolean/Choice settings not working properly on initial launch

See merge request pleroma/pleroma-fe!1389
2021-07-19 16:11:11 +00:00
Henry Jameson
a0eaac2216 fix tests 2021-06-22 21:09:29 +03:00
Henry Jameson
b67db47c88 lint 2021-06-22 20:47:35 +03:00
Henry Jameson
dd3fe61cf3 Merge branch 'better-still-emoji' into proper-attachments
* better-still-emoji:
  fix non-notifying mentions and original mention display
  fix not escaping some stuff
  fix rich images
2021-06-22 20:45:44 +03:00
Henry Jameson
a2f21f4e13 fix description colliding with extra-long text 2021-06-22 20:42:52 +03:00
Henry Jameson
628b99d117 don't stretch columns when uploading media 2021-06-22 20:37:08 +03:00
Henry Jameson
5118eee19a fix videos not stretching to container 2021-06-22 20:35:34 +03:00
Henry Jameson
4ba8d95a10 fix videos and related not having working drag controls 2021-06-22 20:33:57 +03:00
Henry Jameson
4016182b89 fix z-indexes 2021-06-22 20:32:55 +03:00
Henry Jameson
a258182522 fix non-notifying mentions and original mention display 2021-06-22 20:16:26 +03:00
eris
6125dc885a Update for latest develop merges to CHANGELOG 2021-06-20 21:06:59 +00:00
HJ
19475ba356 Merge branch 'develop' into 'develop'
Bug fix: Fix follow request count position on mobile

See merge request pleroma/pleroma-fe!1400
2021-06-20 09:09:32 +00:00
Eris
cd9dd352e3 Fix follow request count position on mobile 2021-06-20 06:27:32 +00:00
Henry Jameson
c6831a3810 fix not escaping some stuff 2021-06-18 21:42:46 +03:00
Henry Jameson
8fe4355a6b fix rich images 2021-06-18 21:29:47 +03:00
Henry Jameson
6b8b9c017f whoops 2021-06-18 17:39:29 +03:00
Henry Jameson
44b741e270 better attachments in uploading (grid layout) 2021-06-18 17:30:56 +03:00
Henry Jameson
8bab8658e8 better handling of unknown files, better upload display 2021-06-18 16:11:16 +03:00
Henry Jameson
bfe31e20ea better compact attachments 2021-06-18 14:12:50 +03:00
Henry Jameson
5c2744b426 Merge branch 'better-still-emoji' into proper-attachments
* better-still-emoji:
  Use proper setting name
  Use cleaner instance config check for shoutbox setting
  Make locale language cleaner
  Don't shorten shoutbox to SB
  Fix lint error
  Update CHANGELOG.md
  New option: Hide shoutbox
2021-06-18 02:28:11 +03:00
Henry Jameson
b68fb7738b Merge remote-tracking branch 'origin/develop' into better-still-emoji
* origin/develop:
  Use proper setting name
  Use cleaner instance config check for shoutbox setting
  Make locale language cleaner
  Don't shorten shoutbox to SB
  Fix lint error
  Update CHANGELOG.md
  New option: Hide shoutbox
2021-06-18 02:27:57 +03:00
Henry Jameson
f35c090caa merged in compact notifs and improved upon it 2021-06-18 02:27:32 +03:00
Henry Jameson
c1293c3afa Merge branch 'compact-notifs' into proper-attachments
* compact-notifs:
  compact notifs
2021-06-18 02:09:50 +03:00
Henry Jameson
f15599e6e5 gallery in post status form! 2021-06-18 02:04:01 +03:00
Henry Jameson
90345f158f gallery now supports flash, fixes for flash component. refactored media modal 2021-06-18 02:03:38 +03:00
Eris
85e2f8f78c Don't show profile edit button in sidebar 2021-06-17 20:57:23 +00:00
eris
b2ebfc1fd6 Merge branch 'develop' into 'editProfile'
# Conflicts:
#   CHANGELOG.md
2021-06-17 19:35:09 +00:00
Eris
e1361a1cae Add edit profile button 2021-06-17 19:29:58 +00:00
Henry Jameson
e654fead23 refactored attachments and gallery. All attachments now are in gallery. 2021-06-17 16:29:46 +03:00
Eris
9c4957268d Use proper setting name 2021-06-17 13:21:25 +03:00
Eris
6689fed513 Use cleaner instance config check for shoutbox setting 2021-06-17 13:21:25 +03:00
Eris
4ecbb58086 Make locale language cleaner 2021-06-17 13:21:25 +03:00
Eris
0a3ce9cc8b Don't shorten shoutbox to SB 2021-06-17 13:21:25 +03:00
Eris
dcfd178314 Fix lint error 2021-06-17 13:21:25 +03:00
Eris
1b26c713ef Update CHANGELOG.md 2021-06-17 13:21:25 +03:00
Eris
9e9ab5cec9 New option: Hide shoutbox 2021-06-17 13:21:25 +03:00
Henry Jameson
a96a62929d Merge remote-tracking branch 'origin/develop' into settings-and-filtering
* origin/develop:
  Use proper setting name
  Use cleaner instance config check for shoutbox setting
  Make locale language cleaner
  Don't shorten shoutbox to SB
  Fix lint error
  Update CHANGELOG.md
  New option: Hide shoutbox
2021-06-16 13:52:13 +03:00
Henry Jameson
1717a3aaf2 fix chats again 2021-06-16 12:44:04 +03:00
Henry Jameson
25bf28f051 added tests just in case 2021-06-16 02:11:24 +03:00
Henry Jameson
ad3a2fd4e5 fixed "invisible" spans inside links 2021-06-16 01:20:20 +03:00
eris
139a0d1562 Merge branch 'develop' into 'themeApply'
# Conflicts:
#   CHANGELOG.md
2021-06-15 21:50:39 +00:00
eris
cab0095989 Merge branch 'develop' into 'showMobileNewPost'
# Conflicts:
#   CHANGELOG.md
#   src/App.js
2021-06-15 21:49:33 +00:00
HJ
338134acfb Merge branch 'hideShoutbox' into 'develop'
New user option: Hide floating shoutbox

See merge request pleroma/pleroma-fe!1396
2021-06-15 21:32:20 +00:00
Eris
d7a53aec61 Use proper setting name 2021-06-15 18:09:00 +00:00
Henry Jameson
4aac0125e5 fixed bug with hashtags 2021-06-15 14:43:44 +03:00
Eris
7e3393b5a2 Use cleaner instance config check for shoutbox setting 2021-06-15 00:59:36 +00:00
Eris
5047663c51 Make locale language cleaner 2021-06-15 00:25:09 +00:00
Eris
e67f295497 Update CHANGELOG.md 2021-06-14 23:32:18 +00:00
Eris
312a237ca4 Revert duplicate buttons and move existing buttons to bottom-right corner independent of scroll 2021-06-14 23:31:16 +00:00
Eris
4639e30cb8 Fix config naming for consistency 2021-06-14 20:41:34 +00:00
Eris
cbccea0546 Don't shorten shoutbox to SB 2021-06-14 20:33:51 +00:00
Eris
b88e6b8ab0 Update CHANGELOG.md 2021-06-14 20:11:57 +00:00
Eris
8fa0331771 Add apply and reset themes to top of theme tab 2021-06-14 20:09:28 +00:00
Eris
1668315bf8 Fix lint error 2021-06-14 20:02:13 +00:00
Eris
1fcccd7570 Update CHANGELOG.md 2021-06-14 19:43:47 +00:00
Eris
0c10145242 New option: Hide shoutbox 2021-06-14 19:42:56 +00:00
Eris
67c9d8bd55 revert gitignore file change 2021-06-14 18:49:37 +00:00
Eris
adfe56a3a3 New option: Always show floating New Post button 2021-06-14 17:54:40 +00:00
Henry Jameson
63c22ad131 Fixed mergedConfig misbehaving on first boot 2021-06-14 10:58:32 +03:00
Henry Jameson
7309f8ce1a lint 2021-06-14 10:31:07 +03:00
Henry Jameson
c21b1cf898 do the impossible, fix the unfixable 2021-06-14 10:30:08 +03:00
Henry Jameson
a3c703bd37 compact notifs 2021-06-14 02:52:41 +03:00
Henry Jameson
636dbdaba8 more fixes 2021-06-13 22:22:59 +03:00
Henry Jameson
1fdfc42159 fix mentions in chats 2021-06-13 21:43:45 +03:00
Henry Jameson
609dc5da0c fix chats messages 2021-06-13 21:42:25 +03:00
Henry Jameson
bebafa1a2c refactored line converter, untied its logic from greentexting, better
handling of broken cases
2021-06-13 15:24:29 +03:00
HJ
e825021ef1 Apply 1 suggestion(s) to 1 file(s) 2021-06-12 18:55:18 +00:00
Henry Jameson
9c70f3e4df fixed a bug + made a testcase out of it 2021-06-12 21:49:56 +03:00
Henry Jameson
2c60a9b638 fix next relply-row bleeding through popover 2021-06-12 20:51:36 +03:00
Henry Jameson
18fb7516cc lint 2021-06-12 20:44:14 +03:00
Henry Jameson
418f029789 review + fixes 2021-06-12 20:43:29 +03:00
Henry Jameson
90a188f2c3 cleanup 2021-06-12 19:54:34 +03:00
Henry Jameson
cd44556750 restructure and tests
squash! restructure and tests
2021-06-12 19:54:30 +03:00
Henry Jameson
ca6c7d5b10 fix tags gluing 2021-06-12 17:20:21 +03:00
Henry Jameson
24f3681ac1 fix color of reply row, fix overflow in status-popover 2021-06-12 17:11:49 +03:00
Henry Jameson
647e4476f9 fix long post fader 2021-06-12 16:25:37 +03:00
Henry Jameson
c1bd36dc6f change how "first" line is determined. Allow one mention in the
beginning for hellthread style
2021-06-12 16:15:22 +03:00
Henry Jameson
ffc501eb23 cleanup 2021-06-11 13:38:08 +03:00
Henry Jameson
9421501c1e lint & cleanup 2021-06-11 11:52:50 +03:00
Henry Jameson
5834790d0b fix #935 2021-06-11 11:50:05 +03:00
Henry Jameson
f819227bed fixed console errors, improved user-selecting, added cyantexting 2021-06-11 11:49:32 +03:00
Henry Jameson
255f47fe56 fix infinite loop 2021-06-11 11:05:28 +03:00
Henry Jameson
f883d2f75c better handling of hellthreads with mentions at bottom 2021-06-11 03:11:58 +03:00
Henry Jameson
b84aeff6bf stylistic changes 2021-06-10 18:52:23 +03:00
Henry Jameson
cc00af7a31 Hellthread(tm) Certified 2021-06-10 18:52:01 +03:00
Henry Jameson
0f73e96194 don't hide mentions for OPs 2021-06-10 15:11:57 +03:00
Henry Jameson
0263834faa mentions on same line as replies 2021-06-10 14:01:26 +03:00
Henry Jameson
6bff7cc6ef use icon instead of symbol for @ in mentions links 2021-06-10 13:29:59 +03:00
Henry Jameson
0260693f51 stylistic improvements for single-line mentions 2021-06-10 13:22:36 +03:00
Henry Jameson
394fd462dc proper cachin of headTailLinks, show mentions in notificaitons always 2021-06-10 13:01:00 +03:00
Henry Jameson
c6c478f4cf moved mentions onto reply line, replies moved below post body 2021-06-10 12:29:58 +03:00
Henry Jameson
aec867b300 Moved greentext to RichContent, improved how first mentions are
restored, now shows mentions not uh, mention in post body
2021-06-10 12:29:58 +03:00
Henry Jameson
566964992a fix long posts having weird gradient 2021-06-08 19:37:18 +03:00
Henry Jameson
5c655b6675 lint 2021-06-08 17:19:38 +03:00
Henry Jameson
8c8237418c fix repeats having wrong mentions 2021-06-08 17:14:22 +03:00
Henry Jameson
963f1679e0 fix console errors 2021-06-08 17:14:22 +03:00
Henry Jameson
a3b8e7ad99 missing localization 2021-06-08 16:37:13 +03:00
Henry Jameson
b87a9d6675 Rearranged settings, moved more stuff to filtering where apllicable.
Changed how filering works.
2021-06-08 16:14:01 +03:00
Henry Jameson
7ae85c8318 change defaults 2021-06-08 14:51:42 +03:00
Henry Jameson
0ae3985a52 bump limit to a saner one 2021-06-08 14:36:41 +03:00
Henry Jameson
2f383c2c01 moved mentions into a separate component - MentionLine, added collapsing
of mentions when there's too many of 'em
2021-06-08 14:34:47 +03:00
Henry Jameson
73127f0e25 fix empty spaces again 2021-06-08 13:42:16 +03:00
Henry Jameson
9ea370033a configurable mentions placement 2021-06-08 12:58:28 +03:00
Henry Jameson
3abd357694 moving mentions into separate row 2021-06-08 11:38:44 +03:00
Henry Jameson
0583a6b863 moved transparent button styles into button itself 2021-06-08 10:14:49 +03:00
Henry Jameson
6bc9886db4 tweaking the spacings 2021-06-08 01:25:03 +03:00
Henry Jameson
ccdf892483 remove weird vertical align 2021-06-08 01:21:45 +03:00
Henry Jameson
38d9ea8b17 lint 2021-06-08 00:09:16 +03:00
Henry Jameson
5740a79dbd faint @ 2021-06-08 00:06:26 +03:00
Henry Jameson
e6d5ddcbb6 better modifier, no background for unhighlighted mentions 2021-06-08 00:03:59 +03:00
Henry Jameson
59d046b163 fix theme selection not working 2021-06-07 23:48:46 +03:00
Henry Jameson
c3e122ff6f smaller mentions 2021-06-07 23:48:01 +03:00
Henry Jameson
7d6fc044fb new mentions look 2021-06-07 23:42:04 +03:00
Henry Jameson
6199788f28 fix tall emojis being cropped 2021-06-07 20:44:32 +03:00
Henry Jameson
8045d1866e localization 2021-06-07 20:25:31 +03:00
Henry Jameson
6090327236 moved some post styles into status body since they inferfere with usernames 2021-06-07 20:02:09 +03:00
Henry Jameson
5e83672274 fixed some strange error 2021-06-07 20:01:57 +03:00
Henry Jameson
aa38223e87 lint 2021-06-07 19:51:04 +03:00
Henry Jameson
8e9f5d7580 renamed StatusText to StatusBody for clarity, fixed chats 2021-06-07 19:50:38 +03:00
Henry Jameson
50aa379038 new component - StatusText, to separate post's text from its attachments 2021-06-07 18:41:55 +03:00
Henry Jameson
04fa1f0b2d some docs, added richcontent to usernames in status, updated stillImage
to allow scale of "gif" label
2021-06-07 18:41:47 +03:00
Henry Jameson
aec05686d0 lint, fix warnings 2021-06-07 18:41:47 +03:00
Henry Jameson
b0ae32e309 made getAttrs correctly handle both ' and " 2021-06-07 18:41:47 +03:00
Henry Jameson
22c8f71945 mention link 2021-06-07 18:41:47 +03:00
Henry Jameson
1923ed84d4 more tests 2021-06-07 18:41:47 +03:00
Henry Jameson
a2459c2187 move styles to richcontent 2021-06-07 18:41:47 +03:00
Henry Jameson
be79643bcf fix emoji processor not leaving string as-is if no emoji are found 2021-06-07 18:41:47 +03:00
Henry Jameson
35dedf8416 lint 2021-06-07 18:41:47 +03:00
Henry Jameson
5970ddf9ac fix escaped apostrophes 2021-06-07 18:41:47 +03:00
Henry Jameson
20ce646852 [WIP] MUCH better approach to replacing emojis with still versions 2021-06-07 18:41:47 +03:00
HJ
2725a0c639 Merge branch 'chore/rename-chat' into 'develop'
Rename legacy PleromaFE Chat functionality to "Shout"

See merge request pleroma/pleroma-fe!1207
2021-06-03 20:16:48 +00:00
Mark Felder
bd98ecb3f0 Remove unused shoutbox channel state from side drawer 2021-06-03 15:07:02 -05:00
Henry Jameson
2a2483f4c9 handle multiple favicons (different sizes) 2021-06-02 12:47:54 +03:00
Henry Jameson
008e711e11 fix favico badge not working on chrome 2021-06-02 12:15:31 +03:00
Mark Felder
21477d07e9 This setting didn't actually do anything 2021-06-01 16:51:47 -05:00
Mark Felder
ed824d964e Use old value to discover if Shoutbox is available until we ship a new release that's declaring the feature as "shout" 2021-06-01 16:48:40 -05:00
Mark Felder
e0cde9a29b Keep channel name the same for backwards compatibility 2021-06-01 14:31:58 -05:00
Mark Felder
0604b1d5b7 Rename legacy PleromaFE Chat functionality to "Shout" 2021-06-01 12:51:20 -05:00
Henry Jameson
32d1a0e181 better approach 2021-05-31 14:23:57 +03:00
HJ
7bd18cda64 Merge branch 'vue3compat-emoji-input' into 'develop'
Refactor EmojiInput for better vue3 compatibility

See merge request pleroma/pleroma-fe!1382
2021-05-31 11:17:42 +00:00
Henry Jameson
e95412a03c fix BooleanSetting and ChoiceSetting not working properly on initial
launch as anon visitor (would show all as changed, empty selects)
2021-05-31 14:16:37 +03:00
HJ
0ca0e642a4 Merge branch 'v-slot-upgrade' into 'develop'
Change old slot syntax (removed in vue3) to new one

See merge request pleroma/pleroma-fe!1379
2021-05-31 11:15:44 +00:00
HJ
4e96af0442 Merge branch 'better-selects' into 'develop'
Better <select> components

See merge request pleroma/pleroma-fe!1373
2021-05-31 11:08:56 +00:00
Henry Jameson
80220c1b07 fix warnings 2021-05-31 14:08:12 +03:00
Henry Jameson
c039656460 fix warnings 2021-05-31 14:02:36 +03:00
HJ
dc611dffdb Merge branch 'flash-support' into 'develop'
Flash support

See merge request pleroma/pleroma-fe!1380
2021-05-31 11:00:53 +00:00
Henry Jameson
159bbed2f9 oops 2021-05-31 13:59:44 +03:00
Henry Jameson
245addb530 remove "leak ur cookiz" 2021-05-31 13:55:28 +03:00
HJ
0741d1d93d Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1378
2021-05-26 22:23:56 +00:00
HJ
477e22aa9c Merge branch 'feat/sidebarRight' into 'develop'
Implement right sidebar option as user option

See merge request pleroma/pleroma-fe!1387
2021-05-26 22:22:55 +00:00
eris
7341b8a551 Implement right sidebar option as user option 2021-05-26 22:22:55 +00:00
Issabella Deinschnitzel
711bf0910a Translated using Weblate (German)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-05-22 16:36:51 +00:00
Ben Is
330665dacb Translated using Weblate (Italian)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-05-19 13:41:25 +00:00
Issabella Deinschnitzel
e338f6be75 Translated using Weblate (German)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-05-16 20:19:26 +00:00
Snow
eda817cc18 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-05-12 12:09:34 +00:00
Issabella Deinschnitzel
1e0479b171 Translated using Weblate (German)
Currently translated at 95.9% (681 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-05-12 12:09:33 +00:00
Issabella Deinschnitzel
64aba422d5 Translated using Weblate (German)
Currently translated at 88.4% (628 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-05-11 15:53:02 +00:00
Anonymous
98da8fd441 Translated using Weblate (German)
Currently translated at 88.4% (628 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-05-11 15:53:00 +00:00
Ryo Ueno
b50a9a1d56 Translated using Weblate (Korean)
Currently translated at 62.6% (445 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2021-05-06 16:41:19 +00:00
grillchen
fdd4be3dcb Translated using Weblate (German)
Currently translated at 72.8% (517 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-05-02 14:03:24 +00:00
Anonymous
407bdbf996 Translated using Weblate (German)
Currently translated at 67.7% (481 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-04-30 18:43:32 +00:00
grillchen
cec13609cd Translated using Weblate (German)
Currently translated at 67.7% (481 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-04-30 18:43:31 +00:00
tarteka
e55644f153 Translated using Weblate (Spanish)
Currently translated at 99.5% (707 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-04-30 00:26:51 +00:00
Anonymous
98d12beb9e Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-28 16:17:43 +00:00
Fristi
d7607792fe Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-28 16:17:43 +00:00
grillchen
f28f632e86 Translated using Weblate (German)
Currently translated at 63.6% (452 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/de/
2021-04-28 16:17:41 +00:00
Anonymous
62ba237217 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:44:49 +00:00
Fristi
e053ac9865 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:44:48 +00:00
Anonymous
e8449166e1 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:38:56 +00:00
Fristi
fd3b806c24 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:38:55 +00:00
Anonymous
39b6214447 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:38:12 +00:00
Fristi
f8fde93c51 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:38:11 +00:00
Anonymous
a6f66cfa2a Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:37:50 +00:00
Fristi
acfd70bd3e Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:37:49 +00:00
Anonymous
303cf39142 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:37:27 +00:00
Fristi
31e342a005 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:37:26 +00:00
Anonymous
61b60f8aa3 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:37:04 +00:00
Fristi
98735bf340 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:37:03 +00:00
Anonymous
4cebc94324 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:35:36 +00:00
Fristi
be09a42253 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:35:35 +00:00
Anonymous
3a0d4fdc24 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:35:01 +00:00
Fristi
6d40c4f9be Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:35:00 +00:00
Anonymous
5e82b7e316 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:06:26 +00:00
Fristi
dc81367260 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:06:25 +00:00
Anonymous
e262103e7d Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:02:51 +00:00
Fristi
2d8c325926 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 18:02:50 +00:00
Anonymous
78fbee36aa Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 17:58:13 +00:00
Fristi
099b5a7d38 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 17:58:12 +00:00
Anonymous
55fa353469 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 17:57:51 +00:00
Fristi
70cef8d9b5 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 17:57:50 +00:00
Anonymous
e958c8e943 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 17:42:55 +00:00
Fristi
a0453f7af8 Translated using Weblate (Dutch)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 17:42:54 +00:00
Anonymous
225f8c44d6 Translated using Weblate (Dutch)
Currently translated at 88.5% (629 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 16:47:24 +00:00
Fristi
8830a1652c Translated using Weblate (Dutch)
Currently translated at 88.5% (629 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 16:47:23 +00:00
Anonymous
3f68af086a Translated using Weblate (Dutch)
Currently translated at 88.1% (626 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 16:45:47 +00:00
Fristi
b780f76b37 Translated using Weblate (Dutch)
Currently translated at 88.1% (626 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 16:45:46 +00:00
Anonymous
b406ebdc39 Translated using Weblate (Dutch)
Currently translated at 87.8% (624 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 15:10:24 +00:00
Fristi
323cc8271f Translated using Weblate (Dutch)
Currently translated at 87.8% (624 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 15:10:23 +00:00
Anonymous
0578467ecf Translated using Weblate (Dutch)
Currently translated at 87.0% (618 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 10:28:20 +00:00
Fristi
35438d93f0 Translated using Weblate (Dutch)
Currently translated at 87.0% (618 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-27 10:28:12 +00:00
Anonymous
110a37f68f Translated using Weblate (Dutch)
Currently translated at 86.3% (613 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-25 13:55:30 +00:00
Fristi
4d54ae91d7 Translated using Weblate (Dutch)
Currently translated at 86.3% (613 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-25 13:55:30 +00:00
Anonymous
62679e24ab Translated using Weblate (Dutch)
Currently translated at 85.3% (606 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-25 13:46:41 +00:00
Fristi
c1da12e2cd Translated using Weblate (Dutch)
Currently translated at 85.3% (606 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-25 13:46:40 +00:00
Fristi
5ef0184469 Translated using Weblate (Dutch)
Currently translated at 81.6% (580 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-25 13:37:14 +00:00
Anonymous
b65ee94f93 Translated using Weblate (Dutch)
Currently translated at 81.6% (580 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nl/
2021-04-25 13:37:13 +00:00
Henry Jameson
8a9115b58e temp fix for now-unused resettable async component 2021-04-25 14:51:15 +03:00
Henry Jameson
b6e8c12dbc emoji picker fix 2021-04-25 14:51:00 +03:00
Henry Jameson
e73cb423b6 fix login form 2021-04-25 14:44:07 +03:00
Henry Jameson
e47d5ba53b fix importer/exporter i18n 2021-04-25 14:12:34 +03:00
Henry Jameson
8d46fd78c7 migrate to v-slot 2021-04-25 14:05:25 +03:00
Henry Jameson
95e74319e1 clean warnings from status 2021-04-25 14:05:25 +03:00
Henry Jameson
709b75198d fix portals/teleports 2021-04-25 14:05:25 +03:00
Henry Jameson
caed89f0ae destroyed -> unmounted 2021-04-25 13:44:50 +03:00
Henry Jameson
72956e2343 fix HOCs 2021-04-25 13:40:08 +03:00
Henry Jameson
4b18e0f36e fix status error 2021-04-25 13:33:02 +03:00
Henry Jameson
b479d80366 fix i18n in services 2021-04-25 13:30:18 +03:00
Henry Jameson
9e8513b312 i18n fixes 2021-04-25 13:25:42 +03:00
Henry Jameson
52835cf8bf work around modules cyclic dependencies 2021-04-25 13:25:04 +03:00
Henry Jameson
905b9771ec stop using vue.set 2021-04-25 13:24:08 +03:00
Henry Jameson
fca885e665 resolve TODO VUE3 2021-04-25 13:23:16 +03:00
Henry Jameson
6e687c0663 fix one async component preventing further load 2021-04-25 13:15:02 +03:00
Henry Jameson
180da297f6 Merge branch 'vue3compat-tabswitcher' into vue3-again
* vue3compat-tabswitcher:
  small refactoring to uncouple tab-switcher from settings modal
  fix theme tab, remove console.logs
  Changed some of TabSwitcher's internals for easier Vue3 migration
2021-04-25 12:51:45 +03:00
Henry Jameson
b774472fff Merge branch 'vue3compat-emoji-input' into vue3-again
* vue3compat-emoji-input:
  backport vue3 changes related to emoji-input
2021-04-25 12:51:21 +03:00
Henry Jameson
76a2e6befb remove Vue.component from hooks 2021-04-25 12:50:17 +03:00
Henry Jameson
1f5f612163 remove Vue.component, just export an object. Seems to be working 2021-04-25 12:47:52 +03:00
Henry Jameson
509ec99574 some minor fixes to get it to boot 2021-04-24 18:04:35 +03:00
Henry Jameson
ced9c0fa7e some bare minimum to get vue3 boot (no UI yet) 2021-04-24 17:56:00 +03:00
ZEN
e00c3ccf36 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-04-22 13:49:34 +00:00
ZEN
b486788ed9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-04-21 05:49:24 +00:00
Ryo Ueno
7acad87806 Translated using Weblate (Japanese)
Currently translated at 99.2% (705 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-04-21 05:49:24 +00:00
Ben Is
2d10084939 Translated using Weblate (Italian)
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-04-21 05:49:24 +00:00
Snow
7a46e81edf Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-04-21 05:49:24 +00:00
Anonymous
0775970476 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-04-21 05:49:24 +00:00
Kana
3f4487b5b8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (710 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-04-21 05:49:24 +00:00
Snow
2435d93d2d Translated using Weblate (Chinese (Traditional))
Currently translated at 99.5% (707 of 710 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-04-21 05:49:24 +00:00
Ben Is
29faa6f124 Translated using Weblate (Italian)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-04-21 05:49:24 +00:00
Snow
b97dfec5f6 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.4% (698 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-04-21 05:49:24 +00:00
ZEN
43b4223f16 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-04-21 05:49:24 +00:00
tarteka
86a851849a Translated using Weblate (Spanish)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-04-21 05:49:24 +00:00
Shpuld Shpludson
3dca3639fd Merge branch 'mp/normaliser-safety' into 'develop'
entity_normalizer: safely check screen_name

See merge request pleroma/pleroma-fe!1383
2021-04-21 05:49:15 +00:00
Matilde Park
06d0254cc5 entity_normalizer: safely check screen_name
Prevents a crash on undefined screen name cases.
2021-04-21 01:40:25 -04:00
Henry Jameson
40ac9ef499 backport vue3 changes related to emoji-input 2021-04-18 17:03:31 +03:00
Henry Jameson
33777fab47 small refactoring to uncouple tab-switcher from settings modal 2021-04-18 15:39:06 +03:00
Henry Jameson
b0789fd6fd fix theme tab, remove console.logs 2021-04-18 15:03:28 +03:00
Henry Jameson
433ea02a18 Changed some of TabSwitcher's internals for easier Vue3 migration 2021-04-18 14:58:02 +03:00
Henry Jameson
09ef284af7 better label, better error handling 2021-04-13 00:08:17 +03:00
Henry Jameson
87903fbf6d do not load ruffle multiple times! 2021-04-12 01:15:59 +03:00
Henry Jameson
6b250762f0 translate a variable name to American English from Australian English 2021-04-12 00:52:16 +03:00
Henry Jameson
f0641d05df linting 2021-04-12 00:07:28 +03:00
Henry Jameson
5fdc4a1904 whooops dropped my monstercondo 2021-04-12 00:03:17 +03:00
Henry Jameson
adafae977a Play-on-click, layout improvements. 2021-04-12 00:00:23 +03:00
Henry Jameson
2f549774ab No longer need to put ruffle stuff in source tree. Made ruffle not use
polyfills also.
2021-04-11 23:03:03 +03:00
Henry Jameson
d695dcaff9 experimental flash support through ruffle 2021-04-09 19:14:05 +03:00
Henry Jameson
61dcdbf992 migrate to v-slot 2021-04-07 22:42:34 +03:00
Henry Jameson
1afda1ac6d lost file 2021-04-07 20:53:58 +03:00
Henry Jameson
0c77a3e1d6 remove extra chevron post-merge 2021-04-07 20:47:59 +03:00
Henry Jameson
4e56e64034 Merge remote-tracking branch 'origin/develop' into better-selects
* origin/develop: (76 commits)
  Translated using Weblate (Italian)
  Translated using Weblate (Basque)
  Translated using Weblate (Spanish)
  Translated using Weblate (Chinese (Simplified))
  Translated using Weblate (Italian)
  Translated using Weblate (Chinese (Traditional))
  Translated using Weblate (Russian)
  Translated using Weblate (Italian)
  Translated using Weblate (French)
  Translated using Weblate (Russian)
  Translated using Weblate (Italian)
  Translated using Weblate (French)
  Translated using Weblate (Basque)
  Translated using Weblate (Spanish)
  Translated using Weblate (Chinese (Simplified))
  Translated using Weblate (Japanese)
  Translated using Weblate (Italian)
  Translated using Weblate (Esperanto)
  Translated using Weblate (Chinese (Traditional))
  Translated using Weblate (Norwegian Bokmål)
  ...
2021-04-07 20:45:57 +03:00
HJ
8b96ea9377 Merge branch 'settings-import-export' into 'develop'
Settings backup/restore + small fixes

See merge request pleroma/pleroma-fe!1372
2021-04-07 17:40:07 +00:00
HJ
4e3c4ec1db Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1365
2021-03-25 11:17:04 +00:00
Ben Is
bb7d89cd8c Translated using Weblate (Italian)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-22 18:00:04 +00:00
tarteka
16beb3cbda Translated using Weblate (Basque)
Currently translated at 79.2% (556 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2021-03-17 13:26:02 +00:00
tarteka
9701a28a34 Translated using Weblate (Spanish)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-03-17 13:26:02 +00:00
Kana
5be18d177d Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (701 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-03-17 13:26:02 +00:00
Ben Is
5d9f1fa76f Translated using Weblate (Italian)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-17 13:26:02 +00:00
Snow
d3ae0b3b97 Translated using Weblate (Chinese (Traditional))
Currently translated at 97.5% (685 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-03-17 13:26:02 +00:00
rinpatch
e11e23e6f9 Translated using Weblate (Russian)
Currently translated at 88.6% (622 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:02 +00:00
Ben Is
dc37f07fe2 Translated using Weblate (Italian)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-17 13:26:02 +00:00
Haelwenn (lanodan) Monnier
2367e7ce8f Translated using Weblate (French)
Currently translated at 100.0% (702 of 702 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2021-03-17 13:26:02 +00:00
rinpatch
5872e3dd54 Translated using Weblate (Russian)
Currently translated at 88.5% (619 of 699 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:02 +00:00
Ben Is
2392307290 Translated using Weblate (Italian)
Currently translated at 100.0% (697 of 697 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-17 13:26:02 +00:00
Haelwenn (lanodan) Monnier
e199f26632 Translated using Weblate (French)
Currently translated at 100.0% (697 of 697 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2021-03-17 13:26:02 +00:00
tarteka
d716026f54 Translated using Weblate (Basque)
Currently translated at 79.7% (555 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2021-03-17 13:26:02 +00:00
tarteka
9801906ea1 Translated using Weblate (Spanish)
Currently translated at 100.0% (696 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-03-17 13:26:02 +00:00
Kana
cf35a9697e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (696 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-03-17 13:26:02 +00:00
Ryo Ueno
c97ad72cf0 Translated using Weblate (Japanese)
Currently translated at 100.0% (696 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-03-17 13:26:02 +00:00
Ben Is
41034141d8 Translated using Weblate (Italian)
Currently translated at 100.0% (696 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-17 13:26:01 +00:00
Tirifto
0a4efeb843 Translated using Weblate (Esperanto)
Currently translated at 100.0% (696 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2021-03-17 13:26:01 +00:00
Snow
fb1e57b6b6 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.4% (692 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-03-17 13:26:01 +00:00
fiftyffs
ecac5bb015 Translated using Weblate (Norwegian Bokmål)
Currently translated at 69.8% (486 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nb_NO/
2021-03-17 13:26:01 +00:00
Ben Is
ba8a2f4a20 Translated using Weblate (Italian)
Currently translated at 100.0% (696 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-17 13:26:01 +00:00
Haelwenn (lanodan) Monnier
7fa7809c50 Translated using Weblate (French)
Currently translated at 100.0% (696 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2021-03-17 13:26:01 +00:00
rinpatch
615925e53d Translated using Weblate (Russian)
Currently translated at 88.6% (617 of 696 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
bb1bcfd084 Translated using Weblate (Russian)
Currently translated at 88.0% (609 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Ben Is
f8e2fde99b Translated using Weblate (Italian)
Currently translated at 100.0% (692 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-17 13:26:01 +00:00
Haelwenn (lanodan) Monnier
35d2a809d2 Translated using Weblate (French)
Currently translated at 97.1% (672 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2021-03-17 13:26:01 +00:00
Kana
fa6aba1dbd Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (692 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
2e6a7c9fb8 Translated using Weblate (Russian)
Currently translated at 87.8% (608 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
b0d450075d Translated using Weblate (Russian)
Currently translated at 87.8% (608 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Tirifto
6829c92f63 Translated using Weblate (Esperanto)
Currently translated at 99.5% (689 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
47507b72dc Translated using Weblate (Russian)
Currently translated at 86.1% (596 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
37944a19c3 Translated using Weblate (Russian)
Currently translated at 86.1% (596 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
65e510c3f2 Translated using Weblate (Russian)
Currently translated at 85.2% (590 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
f28d71d769 Translated using Weblate (Russian)
Currently translated at 85.2% (590 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
73b053db5c Translated using Weblate (Russian)
Currently translated at 84.9% (588 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
a450772039 Translated using Weblate (Russian)
Currently translated at 84.9% (588 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
fe1d90ebc3 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
e9ead1bfdd Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Anonymous
7ef1db1556 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
3739c58855 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
3a07fe2572 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
8a9913c5f6 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
0a0bb6078b Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
08a44ee4a1 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Dmitriy Nelovchenko
822d73c221 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
rinpatch
deac610df6 Translated using Weblate (Russian)
Currently translated at 84.8% (587 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-03-17 13:26:01 +00:00
Ryo Ueno
a7d64d038a Translated using Weblate (Korean)
Currently translated at 66.7% (462 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2021-03-17 13:26:01 +00:00
Ryo Ueno
f70921b984 Translated using Weblate (Japanese)
Currently translated at 100.0% (692 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-03-17 13:26:01 +00:00
Ben Is
d839c1ac89 Translated using Weblate (Italian)
Currently translated at 100.0% (692 of 692 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-03-17 13:26:01 +00:00
Shpuld Shpludson
aacd909846 Merge branch 'feat/moderation-tools-chevron' into 'develop'
Add a chevron to moderation tools button to indicate it opens a menu

Closes #1069

See merge request pleroma/pleroma-fe!1377
2021-03-17 13:25:43 +00:00
Shpuld Shpludson
d57ee274de Merge branch 'feat/notification-quick-filters' into 'develop'
Add quick filters for notifications

See merge request pleroma/pleroma-fe!1364
2021-03-17 08:17:23 +00:00
Shpuld Shpuldson
8163c7b55b v-slot 2021-03-16 08:35:29 +02:00
rinpatch
4c36ac12b6 Add a chevron to moderation tools button to indicate it opens a menu
Closes #1069
2021-03-15 17:49:52 +03:00
Shpuld Shpludson
d262f208dc Merge branch 'feat/do-not-capitalize-every-word' into 'develop'
Do not capitalize every word in random strings

See merge request pleroma/pleroma-fe!1376
2021-03-15 12:33:44 +00:00
rinpatch
feb40ec5ff Do not capitalize every word in random strings
Capitalization like that is only ever used in article/book titles, I
have not seen another website use it in interface elements.
2021-03-15 13:49:03 +03:00
Shpuld Shpludson
5ce298ead4 Merge branch 'feat/replace-generic-submit' into 'develop'
Use more specific button titles instead of general.submit

See merge request pleroma/pleroma-fe!1375
2021-03-15 10:38:04 +00:00
rinpatch
47719571e4 Use more specific button titles instead of general.submit
- "Post" for post submission (we already had the button title be "Posting"
when the post was being sent, so there was a weird inconsistency)
- "Register" for registration submission
- "Save changes" for usages in settings
2021-03-15 13:28:33 +03:00
Shpuld Shpludson
a00212a3bb Merge branch 'websocket-fixes' into 'develop'
Various websocket fixes

See merge request pleroma/pleroma-fe!1326
2021-03-15 09:45:38 +00:00
Shpuld Shpuldson
c682c1730f fix changelog 2021-03-15 11:05:00 +02:00
Shpuld Shpuldson
19fc7dda9e merge conflict, use v-slot:trigger, fix popover svg dimensions bug 2021-03-15 11:02:16 +02:00
Shpuld Shpludson
184364c7e0 Merge branch 'feat/timeline-menu-in-navpanel' into 'develop'
Add timeline menu toggle to nav panel

See merge request pleroma/pleroma-fe!1352
2021-03-15 07:03:22 +00:00
Henry Jameson
2da37f15ab Cleanup boolean/choice setting 2021-03-11 17:04:31 +02:00
Henry Jameson
8e88d8110b fix for filtering tab 2021-03-11 17:00:58 +02:00
Henry Jameson
1f0ac68fcd implement ChoiceSetting for settings modal similar to BooleanSetting 2021-03-11 16:55:14 +02:00
Henry Jameson
3870a30aea cleanup, fixes 2021-03-11 16:54:03 +02:00
Henry Jameson
5d3bf43fdc ghost styles for poll form 2021-03-11 16:54:03 +02:00
Henry Jameson
c6d4c20982 Made Select component to make using styled selects easier 2021-03-11 16:11:44 +02:00
Henry Jameson
5c064ccf55 fix some css problems + tiny bit cleaning up 2021-03-11 15:14:30 +02:00
Shpuld Shpludson
0475e1c61c Update CHANGELOG.md 2021-03-09 09:45:28 +00:00
Shpuld Shpludson
088683538d Update CHANGELOG.md 2021-03-09 09:45:14 +00:00
Shpuld Shpludson
badb2196a2 Merge branch 'develop' into 'feat/notification-quick-filters'
# Conflicts:
#   CHANGELOG.md
2021-03-09 09:43:01 +00:00
Henry Jameson
a8967d85bd streamlined WS flow, reduced spam amount related to WS reconnections 2021-03-09 02:38:10 +02:00
Henry Jameson
90afcd3420 WIP some work on making errors less spammy 2021-03-08 22:24:39 +02:00
Henry Jameson
2e7bd99444 Merge remote-tracking branch 'origin/develop' into websocket-fixes
* origin/develop: (119 commits)
  Apply 1 suggestion(s) to 1 file(s)
  Make it possible to localize user highlight options
  remove shoutbox test hacks
  fix shoutbox header, use custom scroll-to-bottom system, remove vue-chat-scroll, temporarily add chat test hack
  update changelog with 2.3.0
  change icons around
  Translated using Weblate (Japanese)
  Update timeline_quick_settings.js
  add screen_name_ui to tests
  separate screen_name and screen_name_ui with decoded punycode
  Update CHANGELOG.md
  add basic validation for statusless status notifications
  changelog mention
  fix chat unread badge
  update shelljs to get rid of warnings on build
  save a few characters
  focus input in emoji picker and react picker
  fix vue warnings
  add only to wording
  basic loggedin check for reply filtering
  ...
2021-03-08 22:01:28 +02:00
Henry Jameson
3d95ea6acb cleanup + fix 2021-03-08 21:56:20 +02:00
Henry Jameson
fada49768d extra protection to not write what we don't know 2021-03-08 21:14:03 +02:00
Henry Jameson
914b4eb593 lint 2021-03-08 21:03:55 +02:00
Henry Jameson
395e12cbc6 better error/warnings 2021-03-08 21:00:43 +02:00
Henry Jameson
dda95543e8 implemented import/export for themes 2021-03-08 19:53:30 +02:00
Henry Jameson
bd5b62b107 changed importexport into a service instead of component for simplicity 2021-03-08 19:42:24 +02:00
Henry Jameson
4baa397ed0 fixed another problem with p's broken theme causing theme editor to
become unusable
2021-03-08 19:19:16 +02:00
Henry Jameson
8a590f9269 Cleaned up panel-footer. No longer uses header styles since those look
and work ugly.
2021-03-08 19:18:43 +02:00
Shpuld Shpludson
6281241b92 Merge branch 'feat/user-highlight-localizable' into 'develop'
Make it possible to localize user highlight options

See merge request pleroma/pleroma-fe!1369
2021-03-04 20:02:57 +00:00
rinpatch
c14c144cc8 Apply 1 suggestion(s) to 1 file(s) 2021-03-04 19:46:03 +00:00
rinpatch
b4f5df9ce5 Make it possible to localize user highlight options 2021-03-04 22:24:17 +03:00
Shpuld Shpludson
fb183adc74 Merge branch 'fix/shoutbox-fixes' into 'develop'
Remove vue-chat-scroll, fix up shoutbox header

See merge request pleroma/pleroma-fe!1368
2021-03-03 15:07:10 +00:00
Shpuld Shpuldson
becacf0643 remove shoutbox test hacks 2021-03-03 16:47:59 +02:00
Shpuld Shpuldson
0673511fc2 fix shoutbox header, use custom scroll-to-bottom system, remove vue-chat-scroll, temporarily add chat test hack 2021-03-03 16:46:53 +02:00
Shpuld Shpludson
30057a4944 Merge branch 'chore/update-changelog' into 'develop'
update changelog with 2.3.0

See merge request pleroma/pleroma-fe!1367
2021-03-02 08:03:59 +00:00
Shpuld Shpuldson
d1ab424ebc update changelog with 2.3.0 2021-03-02 09:53:17 +02:00
Shpuld Shpuldson
ae159f6ad8 ui never refers to them as likes 2021-03-01 16:30:10 +02:00
Shpuld Shpuldson
11a036d6d6 changelog 2021-03-01 16:27:24 +02:00
Shpuld Shpuldson
f6af4c43f6 add quick filters for notifications2 2021-03-01 16:21:35 +02:00
Shpuld Shpludson
6d7b5b157b Merge branch 'feat/timeline-quick-settings' into 'develop'
close #1050 - add a quick settings menu to timeline header

Closes #1050

See merge request pleroma/pleroma-fe!1355
2021-03-01 12:12:12 +00:00
Shpuld Shpuldson
fc5483f764 change icons around 2021-03-01 10:14:17 +02:00
HJ
a90910be8f Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1363
2021-03-01 00:10:45 +00:00
Ryo Ueno
846e58c3d2 Translated using Weblate (Japanese)
Currently translated at 100.0% (686 of 686 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-03-01 00:00:58 +00:00
Shpuld Shpludson
91f93d4a55 Merge branch 'develop' into 'feat/timeline-quick-settings'
# Conflicts:
#   CHANGELOG.md
2021-02-28 15:37:39 +00:00
Shpuld Shpludson
670abd633f Update timeline_quick_settings.js 2021-02-28 15:36:51 +00:00
Shpuld Shpludson
b4782ad159 Merge branch 'feat/sensitive-by-default' into 'develop'
close #1054 add sensitive by default option

Closes #1054

See merge request pleroma/pleroma-fe!1354
2021-02-27 18:31:13 +00:00
Shpuld Shpludson
92a9ce67c5 Update CHANGELOG.md 2021-02-27 18:23:11 +00:00
Shpuld Shpludson
aa5cb3d1d2 Merge branch 'fix/punycode-buggy' into 'develop'
Fix punycode handling to be less stupid

Closes #1064

See merge request pleroma/pleroma-fe!1361
2021-02-27 18:12:52 +00:00
Shpuld Shpludson
237f272d15 Merge branch 'develop' into 'fix/punycode-buggy'
# Conflicts:
#   CHANGELOG.md
2021-02-27 18:03:49 +00:00
Shpuld Shpludson
a83fdbbd59 Merge branch 'fix/dont-crash-on-invalid-notificaiton' into 'develop'
close #1043 - add basic validation for statusless status notifications

Closes #1043

See merge request pleroma/pleroma-fe!1360
2021-02-27 16:57:46 +00:00
Shpuld Shpuldson
49aa10e1c0 add screen_name_ui to tests 2021-02-26 16:37:46 +02:00
Shpuld Shpuldson
09fe160e8b separate screen_name and screen_name_ui with decoded punycode 2021-02-26 16:23:11 +02:00
Shpuld Shpludson
7c37f495f6 Update CHANGELOG.md 2021-02-26 12:36:58 +00:00
Shpuld Shpuldson
cd2f5ced31 add basic validation for statusless status notifications 2021-02-26 14:27:25 +02:00
Shpuld Shpludson
59db4582b0 Merge branch 'feat/focus-input-with-emoji-pickers' into 'develop'
close #1048: Focus input in emoji picker and react picker

Closes #1048

See merge request pleroma/pleroma-fe!1357
2021-02-26 11:13:33 +00:00
HJ
20b755d57e Merge branch 'fix-build-warnings' into 'develop'
update shelljs to get rid of warnings on build

See merge request pleroma/pleroma-fe!1358
2021-02-26 10:16:21 +00:00
HJ
a7a69d08a7 Merge branch 'fix/chat-unread-badge' into 'develop'
fix chat unread badge

See merge request pleroma/pleroma-fe!1359
2021-02-26 10:15:09 +00:00
Shpuld Shpuldson
2e7529cf50 changelog mention 2021-02-26 11:03:26 +02:00
Shpuld Shpuldson
6fefa5a9c5 fix chat unread badge 2021-02-26 11:00:21 +02:00
Shpuld Shpuldson
cef6ecb916 update shelljs to get rid of warnings on build 2021-02-26 10:30:30 +02:00
Shpuld Shpuldson
acc08932cd save a few characters 2021-02-25 17:32:54 +02:00
Shpuld Shpuldson
74caf42ed7 Merge branch 'develop' into feat/focus-input-with-emoji-pickers 2021-02-25 17:31:36 +02:00
Shpuld Shpuldson
34d18ac0c4 focus input in emoji picker and react picker 2021-02-25 17:27:29 +02:00
Shpuld Shpludson
dd9e18fd34 Merge branch 'fix-vue-warnings-again' into 'develop'
fix vue warnings

See merge request pleroma/pleroma-fe!1356
2021-02-25 12:43:22 +00:00
Shpuld Shpuldson
59aaade7fc fix vue warnings 2021-02-25 14:32:21 +02:00
Shpuld Shpuldson
096747a5dc add only to wording 2021-02-25 11:12:51 +02:00
Shpuld Shpuldson
93785634a7 basic loggedin check for reply filtering 2021-02-25 11:01:11 +02:00
Shpuld Shpuldson
51a78e8b8a add a quick settings menu for timeline headers 2021-02-25 10:56:16 +02:00
Shpuld Shpuldson
ecb211606c change config comment to be consistent 2021-02-23 10:06:45 +02:00
Shpuld Shpuldson
29dae3c12e update changelog 2021-02-23 10:03:29 +02:00
Shpuld Shpuldson
3f23aecd10 add sensitive by default option 2021-02-23 10:00:23 +02:00
HJ
5faca01261 Merge branch 'fix/redline-final-v2' into 'develop'
fix redline again

See merge request pleroma/pleroma-fe!1353
2021-02-22 18:53:26 +00:00
Shpuld Shpuldson
485f4b899c changelog conflict 2021-02-22 18:11:27 +02:00
Shpuld Shpuldson
e14b9ddc02 changelog conflict fix 2021-02-22 18:00:02 +02:00
Shpuld Shpludson
3d013630ae Merge branch 'fix/scroll-lock-jumpiness' into 'develop'
Fix some UI jumpiness on scroll lock

See merge request pleroma/pleroma-fe!1343
2021-02-22 15:14:23 +00:00
Shpuld Shpludson
589ab6510c Merge branch 'feat/keep-chat-perf-up' into 'develop'
Optimize chat perf in long run

See merge request pleroma/pleroma-fe!1350
2021-02-22 15:01:05 +00:00
Shpuld Shpludson
e8b8c3cc49 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1351
2021-02-22 15:00:47 +00:00
Shpuld Shpuldson
2f60c6a821 fix redline again 2021-02-22 16:44:12 +02:00
Shpuld Shpuldson
98cb9abac7 Add timeline menu toggle to nav panel 2021-02-22 16:24:04 +02:00
Kana
5ddfc787ed Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (684 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-02-22 03:28:44 +00:00
Ryo Ueno
226ec1c5be Translated using Weblate (Korean)
Currently translated at 66.8% (458 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2021-02-21 03:00:16 +00:00
Ryo Ueno
3983ea79cd Translated using Weblate (Korean)
Currently translated at 66.7% (457 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2021-02-21 02:51:00 +00:00
Ryo Ueno
20997d6cfc Translated using Weblate (Japanese)
Currently translated at 100.0% (685 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-02-21 02:50:57 +00:00
Ben Is
d5f191db38 Translated using Weblate (Italian)
Currently translated at 100.0% (685 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-02-21 02:50:55 +00:00
Tirifto
d0b1a68f86 Translated using Weblate (Esperanto)
Currently translated at 100.0% (683 of 683 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2021-02-20 20:37:20 +00:00
Shpuld Shpludson
a89710452a Merge branch 'feat/reason-in-registration' into 'develop'
Close #1047 - add reason field for registration when needed

Closes #1047

See merge request pleroma/pleroma-fe!1347
2021-02-20 20:37:12 +00:00
HJ
663362db56 Merge branch 'fix/poll-type-text-overflow' into 'develop'
add padding to poll type to not have arrow icon overlap text

See merge request pleroma/pleroma-fe!1345
2021-02-20 19:29:02 +00:00
HJ
a7f055a875 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1348
2021-02-20 19:27:51 +00:00
Shpuld Shpuldson
67f3532ac9 add additional check with timeout 2021-02-18 10:14:45 +02:00
Shpuld Shpuldson
ee1cf36d52 update changelog 2021-02-17 10:54:14 +02:00
Shpuld Shpuldson
7834ff52b1 add test 2021-02-17 10:53:38 +02:00
Shpuld Shpuldson
47770ed715 get rid of older messages when scrolling down in chat to keep it from bloating dom 2021-02-17 10:16:58 +02:00
Kana
e720d4dd8a Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (682 of 683 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-02-15 10:26:04 +00:00
rinpatch
aa240f935f Merge branch 'chore/mailmap' into 'develop'
Add myself to .mailmap

See merge request pleroma/pleroma-fe!1349
2021-02-15 10:25:57 +00:00
rinpatch
265bb2cd41 Add myself to .mailmap
I changed my email to rin@patch.cx
2021-02-15 13:17:52 +03:00
Shpuld Shpuldson
23a5c601a7 changelog 2021-02-15 11:35:14 +02:00
Shpuld Shpuldson
b4580d086f Merge branch 'develop' into feat/reason-in-registration 2021-02-15 11:10:38 +02:00
Shpuld Shpuldson
a636e53404 add reason field when approval is required 2021-02-15 11:10:09 +02:00
HJ
2f8d4c7406 Merge branch 'fix/weblate-conflicts' into 'develop'
Merge Weblate updates

See merge request pleroma/pleroma-fe!1346
2021-02-15 08:33:58 +00:00
rinpatch
3d25946bbf Merge Weblate updates
There was a merge conflict so it had to be done manually.
2021-02-15 11:25:03 +03:00
Shpuld Shpuldson
c3b267f2b9 add padding to poll type to not have arrow icon overlap text 2021-02-15 08:30:41 +02:00
Shpuld Shpludson
44bddf6cd2 Merge branch 'fix/usercard-use-general-roles' into 'develop'
User card: use general.role instead of card-specific roles

See merge request pleroma/pleroma-fe!1344
2021-02-15 06:20:55 +00:00
Ryo Ueno
7e11093fcd Translated using Weblate (Japanese)
Currently translated at 100.0% (685 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-02-14 09:49:18 +00:00
Ben Is
cba48476ad Translated using Weblate (Italian)
Currently translated at 100.0% (685 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-02-14 09:49:16 +00:00
rinpatch
033b7eaeb9 Translated using Weblate (Russian)
Currently translated at 83.6% (573 of 685 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-02-13 22:05:02 +00:00
rinpatch
6acf812101 User card: use general.role instead of card-specific roles
Also removes admin_menu.roles from some localizations since it is not
used anywhere
2021-02-13 16:34:43 +03:00
Ben Is
376d431681 Translated using Weblate (Italian)
Currently translated at 100.0% (682 of 682 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-02-12 19:15:48 +00:00
Ryo Ueno
0dc6937bf8 Translated using Weblate (Korean)
Currently translated at 57.3% (390 of 680 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2021-02-12 19:15:48 +00:00
Anonymous
a848462f19 Translated using Weblate (Japanese)
Currently translated at 98.8% (672 of 680 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-02-12 19:15:48 +00:00
Ryo Ueno
cccdda3a7b Translated using Weblate (Japanese)
Currently translated at 98.8% (672 of 680 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-02-12 19:15:48 +00:00
Anonymous
e85fa160c7 Translated using Weblate (Japanese)
Currently translated at 98.0% (667 of 680 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-02-12 19:15:48 +00:00
Ryo Ueno
586c538aa0 Translated using Weblate (Japanese)
Currently translated at 98.0% (667 of 680 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2021-02-12 19:15:48 +00:00
tarteka
21e2b3ce0e Translated using Weblate (Spanish)
Currently translated at 100.0% (680 of 680 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-02-12 19:15:48 +00:00
Ben Is
11081c2870 Translated using Weblate (Italian)
Currently translated at 100.0% (680 of 680 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-02-12 19:15:48 +00:00
Snow
4c845a1a99 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (679 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-02-12 19:15:48 +00:00
Snow
0a3f40eebb Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (679 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-02-12 19:15:48 +00:00
Snow
63317a2fdf Translated using Weblate (Chinese (Traditional))
Currently translated at 99.2% (674 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-02-12 19:15:48 +00:00
LibertAdmin
0ffb7b67ed Translated using Weblate (French)
Currently translated at 98.2% (667 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2021-02-12 19:15:48 +00:00
fiftyffs
1a836c8527 Translated using Weblate (Norwegian Bokmål)
Currently translated at 70.1% (476 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nb_NO/
2021-02-12 19:15:48 +00:00
Shpuld Shpludson
7f3fd9ca21 Merge branch 'multi-choice-poll-wording' into 'develop'
Display 'people voted' instead of 'votes' for multi-answers polls

Closes #993

See merge request pleroma/pleroma-fe!1341
2021-02-12 19:15:42 +00:00
Shpuld Shpuldson
c7018057f1 changelog 2021-02-12 18:49:57 +02:00
Shpuld Shpuldson
398aac6558 remove redundant opacity2 2021-02-12 18:47:10 +02:00
eugenijm
01275fbac0 Ensure poll.voters_count doesn't fallback to poll.votes when it's 0 2021-02-12 19:43:57 +03:00
Shpuld Shpuldson
4859e63a89 Remove body scrollbar in chat layout, keep nav bar still on scroll lock, add tiny fade for media modal 2021-02-12 18:14:54 +02:00
Shpuld Shpludson
b2a96417cf Merge branch 'fix/localize-bot-label' into 'develop'
Make bot label localizable

See merge request pleroma/pleroma-fe!1342
2021-02-12 13:58:11 +00:00
rinpatch
da807a12fb Make bot label localizable 2021-02-12 13:48:39 +03:00
Shpuld Shpludson
8b7c367b04 Merge branch 'staff-grouping' into 'develop'
Group staff by role in the About page

Closes #737

See merge request pleroma/pleroma-fe!1309
2021-02-12 08:05:55 +00:00
Eugenij
13ff99881b Apply 1 suggestion(s) to 1 file(s) 2021-02-10 12:28:39 +00:00
eugenijm
1506b97e35 Display 'people voted' instead of 'votes' for multi-choice polls 2021-02-09 16:36:45 +03:00
HJ
647d75f27c Merge branch 'reactbutton-consistency' into 'develop'
Some fixes for reactbutton/extrabuttons

See merge request pleroma/pleroma-fe!1340
2021-02-09 13:12:42 +00:00
Henry Jameson
213c5637d4 Cleanup ReactButton's CSS, fix hitboxes of reactbutton and extrabuttons 2021-02-03 09:18:44 +02:00
HJ
6f3acb3c1b Merge branch 'fix-otp-login-kbd' into 'develop'
Fix #1033 as well as other (potential) similar issues

Closes #1033

See merge request pleroma/pleroma-fe!1338
2021-02-03 06:23:35 +00:00
HJ
7d4c7e3b3f Merge branch 'settings-changed' into 'develop'
Boolean settings improvements

See merge request pleroma/pleroma-fe!1257
2021-02-02 20:27:23 +00:00
Henry Jameson
78f8147aa6 change react button classnames for consistency 2021-02-01 21:07:40 +02:00
Henry Jameson
982c799b6f fix a bunch of <button>s acting as submit buttons breaking enter key 2021-02-01 21:07:09 +02:00
Henry Jameson
66f3e72b54 update branch with recent develop changes (FA, added settings) 2021-02-01 20:08:36 +02:00
Henry Jameson
8958f386be Merge remote-tracking branch 'origin/develop' into settings-changed
* origin/develop: (306 commits)
  fallback if shadows aren't defined
  Translated using Weblate (Chinese (Traditional))
  Translated using Weblate (Ukrainian)
  Translated using Weblate (Italian)
  Translated using Weblate (Ukrainian)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Italian)
  Translated using Weblate (Russian)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Russian)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  Translated using Weblate (Portuguese)
  ...
2021-02-01 19:39:57 +02:00
Shpuld Shpludson
de66267a07 Merge branch 'fix/use-current-app-locale' into 'develop'
Use app locale with toLocaleString/toLocaleDateString

See merge request pleroma/pleroma-fe!1301
2021-01-29 08:38:15 +00:00
HJ
6e4a0d408c Merge branch 'fix-fix-themes' into 'develop'
fallback if shadows aren't defined

See merge request pleroma/pleroma-fe!1337
2021-01-28 12:14:28 +00:00
Henry Jameson
2576b75059 fallback if shadows aren't defined 2021-01-28 14:05:32 +02:00
HJ
11963de288 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1327
2021-01-27 06:51:53 +00:00
Snow
79e4df99dc Translated using Weblate (Chinese (Traditional))
Currently translated at 98.5% (669 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-01-25 17:04:16 +00:00
Pavlo Bilous
58a92c1b7d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (679 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-25 17:04:16 +00:00
Ben Is
286527b489 Translated using Weblate (Italian)
Currently translated at 100.0% (679 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-01-25 17:04:16 +00:00
rinpatch
bc9cd4170d Translated using Weblate (Ukrainian)
Currently translated at 99.4% (675 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-25 17:04:16 +00:00
João Rodrigues
c4fb123d07 Translated using Weblate (Portuguese)
Currently translated at 100.0% (679 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Ben Is
3b6a30ec9f Translated using Weblate (Italian)
Currently translated at 100.0% (679 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-01-25 17:04:16 +00:00
rinpatch
238e9dcd35 Translated using Weblate (Russian)
Currently translated at 83.9% (570 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-25 17:04:16 +00:00
Artur Mancha
c3e5fd5fa1 Translated using Weblate (Portuguese)
Currently translated at 100.0% (679 of 679 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
rinpatch
05e5bb6404 Translated using Weblate (Russian)
Currently translated at 83.8% (568 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-25 17:04:16 +00:00
João Rodrigues
836fc4d205 Translated using Weblate (Portuguese)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Ana Margarida Guimarães Ribeiro Cardoso
c8240a48d5 Translated using Weblate (Portuguese)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Anonymous
d39e918cd3 Translated using Weblate (Portuguese)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Anonymous
da47d9a43d Translated using Weblate (Portuguese)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
João Rodrigues
0c2b425682 Translated using Weblate (Portuguese)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
André Inácio
ffd673d4a5 Translated using Weblate (Portuguese)
Currently translated at 74.0% (501 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Miguel Carreiro
6df5459ec9 Translated using Weblate (Portuguese)
Currently translated at 74.0% (501 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Anonymous
c5477e489b Translated using Weblate (Portuguese)
Currently translated at 74.0% (501 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
João Rodrigues
cdd632f04c Translated using Weblate (Portuguese)
Currently translated at 74.0% (501 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Miguel Carreiro
e9c5e06f50 Translated using Weblate (Portuguese)
Currently translated at 71.9% (487 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Afonso Pereira
a9cbf3eafe Translated using Weblate (Portuguese)
Currently translated at 71.9% (487 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Afonso Pereira
ac43a8145b Translated using Weblate (Portuguese)
Currently translated at 70.0% (474 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Dr. António
21eac51029 Translated using Weblate (Portuguese)
Currently translated at 70.0% (474 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Afonso Pereira
600ff9a67b Translated using Weblate (Portuguese)
Currently translated at 69.8% (473 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Afonso Pereira
a5def5cf56 Translated using Weblate (Portuguese)
Currently translated at 69.7% (472 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Dr. António
24f7cbf3c9 Translated using Weblate (Portuguese)
Currently translated at 69.7% (472 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Afonso Pereira
916d4e0496 Translated using Weblate (Portuguese)
Currently translated at 69.4% (470 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
João Rodrigues
1036395dfc Translated using Weblate (Portuguese)
Currently translated at 69.4% (470 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Artur Mancha
58528605c8 Translated using Weblate (Portuguese)
Currently translated at 56.8% (385 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
André Inácio
9a074fbdfa Translated using Weblate (Portuguese)
Currently translated at 56.8% (385 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Artur Mancha
e8fb0f313e Translated using Weblate (Portuguese)
Currently translated at 49.0% (332 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Artur Mancha
67a0d83568 Translated using Weblate (Portuguese)
Currently translated at 48.7% (330 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2021-01-25 17:04:16 +00:00
Dmitriy Nelovchenko
7c295e1e0f Translated using Weblate (Russian)
Currently translated at 83.1% (563 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-25 17:04:16 +00:00
yasnost
a02b769c8f Translated using Weblate (Russian)
Currently translated at 83.1% (563 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-25 17:04:16 +00:00
HJ
7b6f68ebcd Merge branch 'fix/shoutbox-mobile' into 'develop'
fix #1051 wrong route in side drawer shoutbox link

Closes #1051

See merge request pleroma/pleroma-fe!1335
2021-01-25 17:04:08 +00:00
Shpuld Shpuldson
9cf487497e fix wrong route in side drawer shoutbox link 2021-01-25 18:49:03 +02:00
HJ
eb2975b64d Merge branch 'fix-p-themes' into 'develop'
Fix p's weird corrupt theme data crashing theme engine

See merge request pleroma/pleroma-fe!1334
2021-01-24 10:36:03 +00:00
Henry Jameson
272ba8f7a9 Fix p's weird corrupt theme data crashing theme engine 2021-01-23 13:58:40 +02:00
Shpuld Shpludson
28ebb8b0ae Merge branch 'fix/convert-more-hyperlinks-to-buttons' into 'develop'
convert more hyperlink buttons to real buttons

See merge request pleroma/pleroma-fe!1333
2021-01-22 13:21:16 +00:00
Shpuld Shpuldson
27a537d307 give delete field its own class 2021-01-22 12:06:39 +02:00
Shpuld Shpuldson
daa9f211a6 Merge branch 'develop' into fix/convert-more-hyperlinks-to-buttons 2021-01-22 12:04:58 +02:00
rinpatch
60a8a89f5b Use app locale with toLocaleString/toLocaleDateString
Fixes inconsistent date formatting when browser language is different
from PleromaFE language.
2021-01-21 20:31:54 +03:00
Shpuld Shpludson
0358284ebf Merge branch 'feat/language-picker-native-names' into 'develop'
Use native language names in the language picker

See merge request pleroma/pleroma-fe!1302
2021-01-21 13:41:36 +00:00
rinpatch
11c7355749 Use native language names in the language picker
This seems more intuitive to me and is what I've seen in most other
language pickers.
2021-01-21 14:24:16 +03:00
feld
f614da2abb Merge branch 'breaking/adminapi-user-deactivated' into 'develop'
Support old user.deactivated and new user.is_active fields

See merge request pleroma/pleroma-fe!1329
2021-01-20 22:49:42 +00:00
feld
831cf9eafb Apply 1 suggestion(s) to 1 file(s) 2021-01-20 14:47:13 -06:00
Shpuld Shpludson
e14917e28d Merge branch 'feat/user-role-i18n' into 'develop'
UserCard: Make user roles translateable

See merge request pleroma/pleroma-fe!1331
2021-01-20 15:40:47 +00:00
Shpuld Shpuldson
02ab803725 change a few more buttons to real buttons 2021-01-20 17:36:40 +02:00
Shpuld Shpuldson
9bf80cc7be Merge branch 'develop' into fix/convert-more-hyperlinks-to-buttons 2021-01-20 17:14:09 +02:00
Shpuld Shpludson
62dcf34e0d Merge branch 'chore/backport-release-in-changelog' into 'develop'
Chore/backport release in changelog

See merge request pleroma/pleroma-fe!1332
2021-01-20 15:13:40 +00:00
Shpuld Shpuldson
8011556c28 backport 2.2.3 to changelog 2021-01-20 17:03:51 +02:00
Shpuld Shpuldson
dcba920f92 fix profile field buttons, remove attachment button 2021-01-20 17:01:57 +02:00
rinpatch
b76a68e622 UserCard: Make user roles translateable
I did not add a translation for my native language in this patch because
I am not sure how weblate would react, but I did add it locally and it
seems to work.
2021-01-20 14:04:00 +03:00
Mark Felder
36e56354e4 More robust backwards compatibility 2021-01-19 10:01:55 -06:00
Mark Felder
9656c9b969 Support old user.deactivated and new user.is_active fields 2021-01-18 15:54:12 -06:00
Shpuld Shpludson
fe78ed78fd Merge branch 'feat/dont-filter-own-posts' into 'develop'
Don't filter own posts

See merge request pleroma/pleroma-fe!1323
2021-01-18 13:09:25 +00:00
Henry Jameson
9a8bc245a6 fixed few-posts TLs when streaming is enabled 2021-01-13 22:17:29 +02:00
Henry Jameson
48bef143d8 fix not being able to re-enable sockets until page refresh 2021-01-13 21:33:20 +02:00
Henry Jameson
64fa662644 added notices for ws events 2021-01-13 21:32:25 +02:00
Henry Jameson
adc3b17fe0 add success global notice style/level 2021-01-13 21:29:12 +02:00
Henry Jameson
835eaf33b1 fix local dev websockets 2021-01-13 21:28:34 +02:00
HJ
8c82bb61f1 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1325
2021-01-13 12:51:33 +00:00
Ben Is
38e5eec122 Translated using Weblate (Italian)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-01-13 11:00:37 +00:00
Shpuld Shpludson
f52bca04c9 Merge branch 'feat/allow-reporting-status-directly' into 'develop'
Add report button to status ellipsis menu

See merge request pleroma/pleroma-fe!1324
2021-01-12 16:01:15 +00:00
Shpuld Shpuldson
0ee0551a47 fix changing reported status on same user 2021-01-12 14:55:31 +02:00
Shpuld Shpuldson
65dbf7b85d Add report button to status ellipsis menu 2021-01-12 14:43:21 +02:00
Shpuld Shpludson
728726cf17 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1305
2021-01-12 12:01:32 +00:00
Shpuld Shpuldson
cdb9b4aea2 changelog update 2021-01-11 19:41:42 +02:00
Shpuld Shpuldson
5ab96ae0d2 don't filter own posts 2021-01-11 19:40:35 +02:00
Kana
1a89ec5d8a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-01-05 08:09:18 +00:00
Marcin Mikołajczak
83db5f0916 Translated using Weblate (Polish)
Currently translated at 99.8% (676 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pl/
2021-01-05 08:09:18 +00:00
Dmitriy Nelovchenko
4f69c41fa5 Translated using Weblate (Russian)
Currently translated at 79.6% (539 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-05 08:09:18 +00:00
Dmitriy Nelovchenko
8729c66374 Translated using Weblate (Russian)
Currently translated at 78.8% (534 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-05 08:09:18 +00:00
rinpatch
6670668a7c Translated using Weblate (Russian)
Currently translated at 77.9% (528 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-05 08:09:18 +00:00
tarteka
c1de7b60e1 Translated using Weblate (Spanish)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2021-01-05 08:09:18 +00:00
Ben Is
bdee1277b1 Translated using Weblate (Italian)
Currently translated at 100.0% (677 of 677 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-01-05 08:09:18 +00:00
Kana
12991f915f Translated using Weblate (Chinese (Traditional))
Currently translated at 98.9% (668 of 675 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-01-05 08:09:18 +00:00
Kana
2053b3396a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (675 of 675 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-01-05 08:09:18 +00:00
Ben Is
e98c19c725 Translated using Weblate (Italian)
Currently translated at 100.0% (675 of 675 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-01-05 08:09:18 +00:00
ZEN
3681d6bbd1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (675 of 675 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
Ben Is
e3b02de6fb Translated using Weblate (Italian)
Currently translated at 100.0% (672 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2021-01-05 08:09:18 +00:00
Митець
fa6cfc8238 Translated using Weblate (Ukrainian)
Currently translated at 99.8% (671 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
shironeko
2509bfc5e6 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.4% (668 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2021-01-05 08:09:18 +00:00
Kana
d50798e8ce Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (672 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-01-05 08:09:18 +00:00
shironeko
b5dca9bbe2 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (672 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-01-05 08:09:18 +00:00
rinpatch
3987020216 Translated using Weblate (Russian)
Currently translated at 78.5% (528 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-05 08:09:18 +00:00
Tirifto
271f9e539a Translated using Weblate (Esperanto)
Currently translated at 100.0% (672 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2021-01-05 08:09:18 +00:00
shironeko
a2dff27737 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.7% (670 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-01-05 08:09:18 +00:00
Kana
467efc4639 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.7% (670 of 672 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-01-05 08:09:18 +00:00
Kana
646ff273ee Translated using Weblate (Chinese (Simplified))
Currently translated at 99.7% (669 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2021-01-05 08:09:18 +00:00
rinpatch
2b6b5ff227 Translated using Weblate (Russian)
Currently translated at 77.4% (520 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-05 08:09:18 +00:00
Митець
cf796d8f5c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
ZEN
762204f3be Translated using Weblate (Ukrainian)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
rinpatch
d1f51d946b Translated using Weblate (Russian)
Currently translated at 77.3% (519 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2021-01-05 08:09:18 +00:00
ZEN
837df4f5a5 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
ZEN
76809e9d24 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
Митець
1847315353 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
ZEN
07b31a7d9c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
Митець
9780e1fc11 Translated using Weblate (Ukrainian)
Currently translated at 98.0% (658 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
ZEN
21f624609f Translated using Weblate (Ukrainian)
Currently translated at 98.0% (658 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2021-01-05 08:09:18 +00:00
Shpuld Shpludson
3e7d1fbf23 Merge branch 'fix/punycode-screen-names' into 'develop'
fix #1036 convert screen name to unicode with punycode

Closes #1036

See merge request pleroma/pleroma-fe!1320
2021-01-05 08:09:09 +00:00
Shpuld Shpludson
ef6e2087ae fix #1036 convert screen name to unicode with punycode 2021-01-05 08:09:08 +00:00
HJ
bc23266d70 Merge branch 'fix-emoji-sort-chrome' into 'develop'
fix #1037 chrome sorting didn't like 0, other sorter was just outright broken

Closes #1037

See merge request pleroma/pleroma-fe!1321
2021-01-04 19:44:19 +00:00
Henry Jameson
4b0308ad1f fix #1037 chrome sorting didn't like 0, other sorter was just outright broken 2021-01-04 21:09:12 +02:00
HJ
9d45db959f Merge branch 'lang-switcher-zh_Hant' into 'develop'
Added Traditional Chinese to language switcher

See merge request pleroma/pleroma-fe!1319
2021-01-01 15:57:24 +00:00
Kana
9bfc3c275c Added Traditional Chinese to language swithcer 2021-01-01 02:53:16 +00:00
HJ
34d8893f1c Merge branch 'fix/compat-aarch64-mac' into 'develop'
Newer chromedriver works on MacOS aarch64

See merge request pleroma/pleroma-fe!1318
2020-12-29 01:54:18 +00:00
Mark Felder
a36922ae1b Newer chromedriver works on MacOS aarch64
469dd0a6ee
2020-12-28 13:27:13 -06:00
Shpuld Shpludson
3df84ccd5b Merge branch 'fix/follows-followers-not-displaying' into 'develop'
Fix #1034 follows/followers lists not working after update

Closes #1034

See merge request pleroma/pleroma-fe!1317
2020-12-28 18:07:47 +00:00
Shpuld Shpuldson
243383852b make with-load-more not use computeds when they don't work for it 2020-12-28 17:08:15 +02:00
Shpuld Shpludson
2312f6c15a Merge branch 'update-changelog-2.2.2' into 'develop'
update develop changelog with latest release

See merge request pleroma/pleroma-fe!1316
2020-12-28 09:41:46 +00:00
Shpuld Shpuldson
f01dce99df update changelog with latest release 2020-12-28 11:32:52 +02:00
eugenijm
481c71517e Group staff members by role in the About page 2020-12-18 13:41:37 +03:00
HJ
8d9bf3efc8 Merge branch 'plain-bg' into 'develop'
Solid color wallpaper support

See merge request pleroma/pleroma-fe!1314
2020-12-18 08:37:01 +00:00
Henry Jameson
93af7ee36a simplified code, review 2020-12-18 01:01:58 +02:00
Shpuld Shpludson
3359d4ddf6 Merge branch 'fix/timeline-bar-clickables-offset' into 'develop'
Fix #923 block clicks in blank area of timeline menu, fix 'up-to-date' align

Closes #923

See merge request pleroma/pleroma-fe!1300
2020-12-16 17:57:59 +00:00
Shpuld Shpludson
a2f1ad93f5 Merge branch 'develop' into 'fix/timeline-bar-clickables-offset'
# Conflicts:
#   CHANGELOG.md
2020-12-16 17:49:11 +00:00
Shpuld Shpludson
10399c193a Merge branch 'feat/move-external-source-button-to-extra-buttons' into 'develop'
Move external source link to extra buttons, expand the expand button

See merge request pleroma/pleroma-fe!1303
2020-12-16 17:46:15 +00:00
Shpuld Shpludson
466fc84e82 Merge branch 'fix/fix-error-handling-in-profile-tab' into 'develop'
fix #1020 fix error handling in profile tab

Closes #1020

See merge request pleroma/pleroma-fe!1299
2020-12-16 16:51:03 +00:00
Henry Jameson
0cf06cb9ec Merge remote-tracking branch 'origin/develop' into plain-bg
* origin/develop:
  fix remote follow button style
  Disable horizontal textarea resize
  Add uk.json in messages.js
  Display upload limit on the Features panel
  use title html for poll options before vote
  fix recent mistakes in react button
2020-12-16 18:43:38 +02:00
Henry Jameson
81bac9f8ac change your log 2020-12-16 18:33:54 +02:00
Henry Jameson
5cb41c7175 theme ui 2020-12-16 18:28:10 +02:00
Henry Jameson
c197756767 Basic no-wallpaper support 2020-12-16 18:25:07 +02:00
Shpuld Shpludson
34c65e3bcf Merge branch 'fix/remote-follow-button-style' into 'develop'
fix remote follow button style

See merge request pleroma/pleroma-fe!1313
2020-12-16 10:14:10 +00:00
Shpuld Shpuldson
6a469963b0 fix remote follow button style 2020-12-16 12:05:13 +02:00
Shpuld Shpludson
e8cebb568b Merge branch 'develop' into 'fix/timeline-bar-clickables-offset'
# Conflicts:
#   CHANGELOG.md
2020-12-15 19:54:00 +00:00
Shpuld Shpludson
22546ea813 Merge branch 'develop' into 'feat/move-external-source-button-to-extra-buttons'
# Conflicts:
#   CHANGELOG.md
2020-12-15 19:50:59 +00:00
Shpuld Shpludson
5077549c73 Merge branch 'fix/no-emoji-in-poll-when-voting' into 'develop'
fix #1026 use title html for poll options before vote

Closes #1026

See merge request pleroma/pleroma-fe!1307
2020-12-15 19:49:32 +00:00
HJ
32ed09bae5 Merge branch 'prevent-textarea-resize-in-bio' into 'develop'
Disable horizontal textarea resize

Closes #741

See merge request pleroma/pleroma-fe!1312
2020-12-15 18:27:59 +00:00
eugenijm
6d9c79fb6d Disable horizontal textarea resize 2020-12-15 21:18:59 +03:00
HJ
39c4672175 Merge branch 'patch-1' into 'develop'
Add uk.json in messages.js

See merge request pleroma/pleroma-fe!1311
2020-12-14 20:03:45 +00:00
W. W
4451ac9f7c Add uk.json in messages.js 2020-12-14 19:52:07 +00:00
Shpuld Shpludson
bdb994d450 Merge branch 'file-limit-info' into 'develop'
Display the upload limit on the Features panel

Closes #785

See merge request pleroma/pleroma-fe!1308
2020-12-12 14:39:46 +00:00
eugenijm
51e6f5e255 Display upload limit on the Features panel 2020-12-11 17:16:59 +03:00
Shpuld Shpuldson
415119cda9 use title html for poll options before vote 2020-12-07 00:11:21 +02:00
Shpuld Shpludson
99e12091b7 Merge branch 'fix/react-button-whoops' into 'develop'
fix #1025 recent mistakes in react button

Closes #1025

See merge request pleroma/pleroma-fe!1306
2020-12-06 21:54:31 +00:00
Shpuld Shpuldson
83bc74de0a fix recent mistakes in react button 2020-12-06 23:45:34 +02:00
HJ
674c302350 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1298
2020-12-04 14:46:53 +00:00
ZEN
45e08f83aa Translated using Weblate (Ukrainian)
Currently translated at 94.6% (635 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-04 13:04:15 +00:00
rinpatch
3b037218b2 Translated using Weblate (Russian)
Currently translated at 76.9% (516 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-12-04 13:04:14 +00:00
Митець
506cf0902e Translated using Weblate (Ukrainian)
Currently translated at 94.1% (632 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-04 10:56:24 +00:00
Anonymous
bfeb8ed14b Translated using Weblate (Ukrainian)
Currently translated at 93.8% (630 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-04 06:54:47 +00:00
ZEN
ffd0bbbf16 Translated using Weblate (Ukrainian)
Currently translated at 93.8% (630 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-04 06:54:46 +00:00
rinpatch
ff93f43468 Translated using Weblate (Russian)
Currently translated at 76.1% (511 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-12-03 22:18:56 +00:00
ZEN
56927c5a09 Translated using Weblate (Ukrainian)
Currently translated at 90.4% (607 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 21:38:54 +00:00
Митець
c74ee1153d Translated using Weblate (Ukrainian)
Currently translated at 90.4% (607 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 21:38:53 +00:00
Митець
ccf357c206 Translated using Weblate (Ukrainian)
Currently translated at 90.1% (605 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 20:24:08 +00:00
Митець
99c1fb0068 Translated using Weblate (Ukrainian)
Currently translated at 85.6% (575 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 18:02:32 +00:00
ZEN
dc90db91fd Translated using Weblate (Ukrainian)
Currently translated at 85.6% (575 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 18:02:31 +00:00
ZEN
0c3f62642b Translated using Weblate (Ukrainian)
Currently translated at 85.5% (574 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 17:49:21 +00:00
Anonymous
6b7f82174c Translated using Weblate (Ukrainian)
Currently translated at 85.5% (574 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 17:49:01 +00:00
ZEN
a8d3ce4671 Translated using Weblate (Ukrainian)
Currently translated at 85.5% (574 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 17:49:00 +00:00
Anonymous
95b911d7a0 Translated using Weblate (Ukrainian)
Currently translated at 84.6% (568 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 17:24:42 +00:00
Митець
f1066c393f Translated using Weblate (Ukrainian)
Currently translated at 84.5% (567 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 17:01:57 +00:00
ZEN
215e3753e1 Translated using Weblate (Ukrainian)
Currently translated at 84.5% (567 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 17:01:56 +00:00
Митець
426441b51c Translated using Weblate (Ukrainian)
Currently translated at 81.3% (546 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:57:18 +00:00
Shpuld Shpludson
fc4a17aa8c Merge branch 'develop' into 'fix/fix-error-handling-in-profile-tab'
# Conflicts:
#   CHANGELOG.md
2020-12-03 14:41:55 +00:00
Anonymous
f30450be12 Translated using Weblate (Ukrainian)
Currently translated at 81.0% (544 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
17abcda2aa Translated using Weblate (Ukrainian)
Currently translated at 81.0% (544 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
rinpatch
0f8587463c Translated using Weblate (Russian)
Currently translated at 72.1% (484 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-12-03 14:30:36 +00:00
Anonymous
3d8af7256b Translated using Weblate (Ukrainian)
Currently translated at 80.7% (542 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Митець
60598f9bda Translated using Weblate (Ukrainian)
Currently translated at 80.7% (542 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
800964ea6b Translated using Weblate (Ukrainian)
Currently translated at 80.1% (538 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Митець
06d05b7b82 Translated using Weblate (Ukrainian)
Currently translated at 80.1% (538 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
ac45e410d3 Translated using Weblate (Ukrainian)
Currently translated at 80.0% (537 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Митець
4667137fff Translated using Weblate (Ukrainian)
Currently translated at 80.0% (537 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
037185a463 Translated using Weblate (Ukrainian)
Currently translated at 79.8% (536 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Митець
33e3ada7da Translated using Weblate (Ukrainian)
Currently translated at 79.8% (536 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
00c762474f Translated using Weblate (Ukrainian)
Currently translated at 79.8% (536 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Митець
ee0748bff5 Translated using Weblate (Ukrainian)
Currently translated at 79.5% (534 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
2bbb01e751 Translated using Weblate (Ukrainian)
Currently translated at 79.5% (534 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
2ac23d8318 Translated using Weblate (Ukrainian)
Currently translated at 74.8% (502 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
3dcbc2c294 Translated using Weblate (Ukrainian)
Currently translated at 74.8% (502 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
0f2841a98a Translated using Weblate (Ukrainian)
Currently translated at 66.4% (446 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
8a260f4102 Translated using Weblate (Ukrainian)
Currently translated at 66.4% (446 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
c20c418e6d Translated using Weblate (Ukrainian)
Currently translated at 63.1% (424 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
fdcd4828ed Translated using Weblate (Ukrainian)
Currently translated at 63.1% (424 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
6923d5f983 Translated using Weblate (Ukrainian)
Currently translated at 63.0% (423 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
35773e2339 Translated using Weblate (Ukrainian)
Currently translated at 63.0% (423 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
291d9929f8 Translated using Weblate (Ukrainian)
Currently translated at 62.7% (421 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
a3f6476ae1 Translated using Weblate (Ukrainian)
Currently translated at 62.7% (421 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
be2e6f39aa Translated using Weblate (Ukrainian)
Currently translated at 62.5% (420 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
6111affc61 Translated using Weblate (Ukrainian)
Currently translated at 62.5% (420 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
4f54b0123a Translated using Weblate (Ukrainian)
Currently translated at 62.5% (420 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
a5b961ed31 Translated using Weblate (Ukrainian)
Currently translated at 61.9% (416 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
ed5c1c0a4c Translated using Weblate (Ukrainian)
Currently translated at 61.9% (416 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
061a500e0a Translated using Weblate (Ukrainian)
Currently translated at 61.6% (414 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
78b052b6fc Translated using Weblate (Ukrainian)
Currently translated at 61.6% (414 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
66ad886e33 Translated using Weblate (Ukrainian)
Currently translated at 59.7% (401 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
c823800a67 Translated using Weblate (Ukrainian)
Currently translated at 59.7% (401 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
Anonymous
d9b4c87dda Translated using Weblate (Ukrainian)
Currently translated at 58.8% (395 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
60121775f2 Translated using Weblate (Ukrainian)
Currently translated at 58.8% (395 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
rinpatch
8fbf91f3e8 Translated using Weblate (Russian)
Currently translated at 68.5% (460 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-12-03 14:30:36 +00:00
rinpatch
e713e17e9d Translated using Weblate (Russian)
Currently translated at 68.5% (460 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-12-03 14:30:36 +00:00
ZEN
a4a0695c57 Translated using Weblate (Ukrainian)
Currently translated at 58.4% (392 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
9657a5a098 Translated using Weblate (Ukrainian)
Currently translated at 58.4% (392 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
55b0b81252 Translated using Weblate (Ukrainian)
Currently translated at 51.5% (346 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
ae3ded9185 Translated using Weblate (Ukrainian)
Currently translated at 51.5% (346 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
8140501e37 Translated using Weblate (Ukrainian)
Currently translated at 45.0% (302 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
71b0ef8f1b Translated using Weblate (Ukrainian)
Currently translated at 39.3% (264 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
0dc0c816ea Translated using Weblate (Ukrainian)
Currently translated at 35.4% (238 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
2478b5a306 Translated using Weblate (Ukrainian)
Currently translated at 34.5% (232 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
a464135cbd Translated using Weblate (Ukrainian)
Currently translated at 30.2% (203 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
3f452a5462 Translated using Weblate (Ukrainian)
Currently translated at 30.2% (203 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
rinpatch
431e9369c2 Translated using Weblate (Russian)
Currently translated at 60.8% (408 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-12-03 14:30:36 +00:00
W.W
c789db82df Translated using Weblate (Ukrainian)
Currently translated at 24.4% (164 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
171462b246 Translated using Weblate (Ukrainian)
Currently translated at 24.2% (163 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
0cccb39710 Translated using Weblate (Ukrainian)
Currently translated at 23.9% (161 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
a7b2c5cdad Translated using Weblate (Ukrainian)
Currently translated at 23.3% (157 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
a6c93c5eab Translated using Weblate (Ukrainian)
Currently translated at 23.3% (157 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
badbd27e27 Translated using Weblate (Ukrainian)
Currently translated at 21.4% (144 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
ZEN
1116b2cd32 Translated using Weblate (Ukrainian)
Currently translated at 21.3% (143 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
W.W
9cb83648e3 Translated using Weblate (Ukrainian)
Currently translated at 21.3% (143 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-12-03 14:30:36 +00:00
lain
42c747a342 Merge branch 'fix/own-chat-messages-disappearing' into 'develop'
fix #1021: own chat messages disappearing

Closes #1021

See merge request pleroma/pleroma-fe!1304
2020-12-03 14:30:25 +00:00
Shpuld Shpuldson
2427757184 fix your own chat messages disappearing 2020-12-03 16:09:40 +02:00
Shpuld Shpuldson
5d95376bef update changelog 2020-12-03 12:03:23 +02:00
Shpuld Shpuldson
46320090e3 move external source button to extra buttons, make expand button easier to click and highlight on hover 2020-12-03 11:57:17 +02:00
Shpuld Shpuldson
fa01030641 make click blocking actually work 2020-12-03 10:07:42 +02:00
Shpuld Shpuldson
f4b18df644 block clicks in blank area of timeline menu, fix 'up-to-date' align 2020-12-02 16:07:31 +02:00
Shpuld Shpuldson
15ea735006 remove vertical align, update changelog 2020-12-02 12:58:13 +02:00
Shpuld Shpuldson
0d53af786b fix the close button on global notices 2020-12-02 12:55:14 +02:00
Shpuld Shpuldson
b537032e6d Merge branch 'develop' into fix/fix-error-handling-in-profile-tab 2020-12-02 12:48:21 +02:00
Shpuld Shpuldson
4dde9c4d52 refactor error handling in profile tab 2020-12-02 12:46:31 +02:00
Shpuld Shpludson
fdfb8810c1 Merge branch 'fix/use-semantically-correct-buttons' into 'develop'
Fix #1001 Accessibility: Use semantically correct buttons (almost) everywhere

Closes #1001

See merge request pleroma/pleroma-fe!1293
2020-12-01 11:02:46 +00:00
Shpuld Shpludson
c655699935 Merge branch 'feat/react-picker-titles-support-filter-by-emoji' into 'develop'
Fix #1014 add titles in react picker, support filtering by emoji itself

Closes #1014

See merge request pleroma/pleroma-fe!1294
2020-12-01 11:01:29 +00:00
Shpuld Shpludson
10e2648142 Merge branch 'develop' into 'feat/react-picker-titles-support-filter-by-emoji'
# Conflicts:
#   CHANGELOG.md
2020-12-01 10:54:29 +00:00
Shpuld Shpludson
655d985a82 Merge branch 'develop' into 'fix/use-semantically-correct-buttons'
# Conflicts:
#   CHANGELOG.md
2020-12-01 10:47:10 +00:00
Shpuld Shpludson
133294dc2a Merge branch 'feat/add-missing-emoji-and-script' into 'develop'
Update emoji.json, add script that merges new emoji from another source

See merge request pleroma/pleroma-fe!1295
2020-12-01 10:40:33 +00:00
HJ
397622078f Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1297
2020-11-30 20:16:03 +00:00
W.W
f1b36f3b1a Translated using Weblate (Ukrainian)
Currently translated at 10.5% (71 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-11-30 19:41:30 +00:00
HJ
c4b098be0e Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1296
2020-11-30 19:37:42 +00:00
Anonymous
cf3ad0632a Translated using Weblate (Russian)
Currently translated at 55.8% (375 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-11-30 19:28:53 +00:00
rinpatch
848b77acaa Translated using Weblate (Russian)
Currently translated at 55.8% (375 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-11-30 19:28:52 +00:00
ZEN
bd1564765c Translated using Weblate (Ukrainian)
Currently translated at 8.3% (56 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-11-30 19:28:00 +00:00
W.W
c17a0523d5 Translated using Weblate (Ukrainian)
Currently translated at 8.3% (56 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2020-11-30 19:27:58 +00:00
HJ
e0d08490a4 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1269
2020-11-30 19:04:15 +00:00
W.W
2506b2629a Added translation using Weblate (Ukrainian) 2020-11-30 17:57:16 +00:00
Shpuld Shpuldson
e98e285f50 changelog 2020-11-30 14:46:37 +02:00
Shpuld Shpuldson
767db567ad update emoji.json, add script that merges new emoji from another source 2020-11-30 14:43:39 +02:00
Shpuld Shpuldson
a4e76067db changelog 2020-11-28 15:36:48 +02:00
Shpuld Shpuldson
8f118c01a4 add titles in react picker, support filtering by emoji itself 2020-11-28 15:27:58 +02:00
Ben Is
00b93c0947 Translated using Weblate (Italian)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2020-11-27 13:57:44 +00:00
tarteka
95ad9efff3 Translated using Weblate (Spanish)
Currently translated at 100.0% (671 of 671 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2020-11-27 13:57:44 +00:00
Kana
aec6dc7858 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (668 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-11-27 13:57:44 +00:00
Kana
6fbd6ee9ea Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (668 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-11-27 13:57:44 +00:00
Guy Sheffer
83319904c7 Translated using Weblate (Hebrew)
Currently translated at 48.1% (322 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/he/
2020-11-27 13:57:44 +00:00
Tirifto
a68899b4a9 Translated using Weblate (Esperanto)
Currently translated at 100.0% (669 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2020-11-27 13:57:44 +00:00
tarteka
4ac2bc1c44 Translated using Weblate (Spanish)
Currently translated at 100.0% (669 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2020-11-27 13:57:44 +00:00
Shpuld Shpludson
32f77cfbd7 Merge branch 'fix/make-autocomplete-wait-for-request-to-finish' into 'develop'
Fix #1011 Make autocomplete wait for user search to finish before suggesting

Closes #1011

See merge request pleroma/pleroma-fe!1289
2020-11-27 13:57:36 +00:00
Shpuld Shpuldson
e6e3b752d6 review fixes 2020-11-27 15:51:58 +02:00
Shpuld Shpuldson
276ef31145 fix alternative icons having wrong offsets 2020-11-26 23:01:16 +02:00
Shpuld Shpuldson
5dfcf2acac updated changelog 2020-11-26 18:40:39 +02:00
Shpuld Shpuldson
1172feaa72 Add changelog mention for changed button sizes 2020-11-26 18:38:36 +02:00
Shpuld Shpuldson
aea172a6f7 forgot to save a file 2020-11-26 18:25:21 +02:00
Shpuld Shpuldson
bee77ffdb2 fix retweet event handler, fix text being selectable for status action counters 2020-11-26 18:23:53 +02:00
Shpuld Shpuldson
ebe3b38a90 fix nav bar button active style 2020-11-26 17:05:38 +02:00
Shpuld Shpuldson
2137d6395a fix wrong button style, add new option for popover to better deal with different layouts 2020-11-25 18:33:08 +02:00
Shpuld Shpuldson
e771fd8f13 fix missing button style 2020-11-25 10:36:14 +02:00
Shpuld Shpuldson
1d178b7341 fix too big hide button, fix weird 28px hack 2020-11-24 21:35:14 +02:00
Shpuld Shpuldson
04af772c1e address missing button style, fix remaining warning 2020-11-24 17:47:37 +02:00
Shpuld Shpuldson
a6e495e413 fix warnings 2020-11-24 16:10:03 +02:00
Shpuld Shpuldson
38c32c7f7a renames and removals of cursor: pointer 2020-11-24 15:22:01 +02:00
Shpuld Shpuldson
8b775f94a9 more fixes, add fullwidth 2020-11-24 14:52:01 +02:00
Shpuld Shpuldson
7b99d98c55 Replace all use of <a> + href='#' with proper buttons 2020-11-24 12:32:42 +02:00
HJ
14ce0c1c07 Merge branch 'fix/RED-LINE' into 'develop'
fix #1010 Add back conversation red line

Closes #1010

See merge request pleroma/pleroma-fe!1292
2020-11-21 12:10:39 +00:00
Shpuld Shpuldson
11f7b818b4 try another approach 2020-11-20 16:20:08 +02:00
Shpuld Shpuldson
f5186e1a33 add back red line 2020-11-20 16:02:47 +02:00
Shpuld Shpludson
838cbd8715 Merge branch 'nsfw-link-preview' into 'develop'
Click-to-reveal cover for link previews in NSFW posts

Closes #973

See merge request pleroma/pleroma-fe!1287
2020-11-20 07:54:26 +00:00
HJ
4922a8ded9 Merge branch 'features/video-preload-metadata' into 'develop'
video_attachment: Only preload metadata

See merge request pleroma/pleroma-fe!1291
2020-11-19 18:13:58 +00:00
eugenijm
45180d4069 Added the NSFW alert to the link preview. 2020-11-19 20:08:56 +03:00
Haelwenn (lanodan) Monnier
0089d1e8d1
video_attachment: Only preload metadata
This hints browsers that only the metadata and maybe the first few frames are
needed. Which avoids downloading the entire video, which isn't really needed
in our case.
2020-11-19 18:01:21 +01:00
HJ
9684bf6e94 Merge branch 'fix/missing-play-circle-icon' into 'develop'
add missing play-circle icon

See merge request pleroma/pleroma-fe!1290
2020-11-19 12:51:40 +00:00
Shpuld Shpuldson
4001c075d4 add missing play-circle icon 2020-11-19 14:19:03 +02:00
Shpuld Shpuldson
b1ab09b348 fix merge conflict 2020-11-19 12:38:35 +02:00
Shpuld Shpuldson
419df9d446 update some documentation 2020-11-19 12:35:21 +02:00
Shpuld Shpuldson
1cd222d85c changelog mention 2020-11-19 11:42:30 +02:00
Shpuld Shpuldson
1495db084a fix keyboard highlight 2020-11-19 11:37:06 +02:00
Shpuld Shpuldson
0f386ccbc7 use users state + fetching with delay 2020-11-18 18:43:24 +02:00
Shpuld Shpludson
d770bab1b0 Merge branch 'fix/timeline-error-handling-fixes' into 'develop'
Various timeline fixes

See merge request pleroma/pleroma-fe!1283
2020-11-18 11:49:54 +00:00
HJ
cd784396e7 Merge branch 'fix-pinned' into 'develop'
Fix pinned statuses and perhaps some other stuff

See merge request pleroma/pleroma-fe!1288
2020-11-17 18:41:43 +00:00
Henry Jameson
b66b4124f4 Merge remote-tracking branch 'origin/develop' into fix-pinned
* origin/develop:
  change favicon dimensions for high res, add handling when favicon isn't available
  remove the favicon changes
  make badge just a ball, make it use theming
  add favicon badge for unread notifs
2020-11-17 20:32:56 +02:00
Henry Jameson
5c47aeeccf changelong 2020-11-17 20:32:39 +02:00
Shpuld Shpludson
d905a6cb70 Merge branch 'feat/favicon-badge' into 'develop'
Add favicon badge for unread notifs

See merge request pleroma/pleroma-fe!1273
2020-11-17 18:25:05 +00:00
Shpuld Shpuldson
dd3c8631bf store failed experiment 2020-11-17 17:46:26 +02:00
Henry Jameson
49f7c84e3f Fix pinned statuses and perhaps some other stuff 2020-11-17 15:25:38 +02:00
Shpuld Shpludson
fa2884a805 Merge branch 'chore/update-changelog-to-match-release' into 'develop'
Update develop changelog to contain 2.2.1 release

See merge request pleroma/pleroma-fe!1286
2020-11-11 21:13:09 +00:00
Shpuld Shpuldson
6cdf347ed1 update changelog 2020-11-11 23:04:07 +02:00
Shpuld Shpludson
fb5d3d3292 Merge branch 'develop' into 'fix/timeline-error-handling-fixes'
# Conflicts:
#   CHANGELOG.md
2020-11-11 20:58:47 +00:00
HJ
3e1c828ba9 Merge branch 'fix/html-title-name' into 'develop'
Remove title from index.html, title is now from server generated meta

See merge request pleroma/pleroma-fe!1285
2020-11-11 20:51:12 +00:00
Sean King
476154d0ee Remove title from index.html, title is now from server generated meta 2020-11-11 11:57:42 -07:00
HJ
563377b59c Merge branch 'fix/field-name-emoji-parsing' into 'develop'
fix #999  emoji not working in profile field names

Closes #999

See merge request pleroma/pleroma-fe!1284
2020-11-11 10:15:29 +00:00
Shpuld Shpuldson
b536c6e3c5 changelog mention 2020-11-11 10:42:13 +02:00
Shpuld Shpuldson
41dbdc2b28 fix emoji not working in profile field names 2020-11-11 10:40:26 +02:00
Shpuld Shpuldson
1d2ba946b6 make notifications also use the popup errors, remove all error from status/notif state 2020-11-10 14:28:10 +02:00
Shpuld Shpuldson
d150dae5d1 fixes to timeline error handling 2020-11-10 12:52:54 +02:00
Shpuld Shpludson
e6ca489d30 Merge branch 'fix/fix-1px-scroll-on-input' into 'develop'
Fix that 1px scroll on input for real this time maybe

See merge request pleroma/pleroma-fe!1282
2020-11-09 13:18:35 +00:00
Shpuld Shpuldson
c1c207788a change method of fix to rounding 2020-11-09 15:02:48 +02:00
Shpuld Shpuldson
fb80dbbc77 changelog 2020-11-09 14:47:42 +02:00
Shpuld Shpuldson
553155fc49 prevent call to scroll if the value doesn't change because firefox is stupid 2020-11-09 14:42:16 +02:00
Shpuld Shpludson
3963f240d5 Merge branch 'patch-1' into 'develop'
Update CHANGELOG.md

See merge request pleroma/pleroma-fe!1281
2020-11-09 09:08:41 +00:00
Shpuld Shpludson
9ff48b88bf Update CHANGELOG.md 2020-11-09 09:01:16 +00:00
Shpuld Shpludson
3220e72eb9 Merge branch 'patch-1' into 'develop'
Update CHANGELOG.md to match master

See merge request pleroma/pleroma-fe!1279
2020-11-09 08:58:17 +00:00
HJ
def1bd0676 Merge branch 'fix/react-menu-overflow-fix' into 'develop'
Fix #994 react popover overflowing

Closes #994

See merge request pleroma/pleroma-fe!1280
2020-11-09 08:40:59 +00:00
Shpuld Shpuldson
9f96b592d4 wrap react button icon to a span to fix popover overflow 2020-11-09 09:40:20 +02:00
Shpuld Shpludson
82f17961d1 Update CHANGELOG.md to match master 2020-11-06 17:36:43 +00:00
Shpuld Shpuldson
56c1d65384 Merge branch 'develop' into feat/favicon-badge 2020-11-06 14:57:50 +02:00
Shpuld Shpludson
60983ae42b Merge branch 'chat-fix-for-vertical-screen' into 'develop'
Chat scroll fix for vertical screen

Closes #997

See merge request pleroma/pleroma-fe!1277
2020-11-06 12:55:57 +00:00
eugenijm
15ea9d8c91 Fix the chat scroll behavior for vertical screens.
Fetch the messages until the scrollbar becomes visible, so that the user
always has the ability to scroll up and load new messages.
2020-11-06 11:11:19 +03:00
Shpuld Shpludson
dbeecd18ac Merge branch 'advanced-misclick-guard' into 'develop'
Instead of blocking all interaction, only block interaction in places that matter

See merge request pleroma/pleroma-fe!1276
2020-11-04 06:04:19 +00:00
Shpuld Shpludson
b485d21ba9 Merge branch 'fix-chat-badge' into 'develop'
Few more minor fixes

See merge request pleroma/pleroma-fe!1275
2020-11-03 17:09:10 +00:00
Henry Jameson
4e4b258c54 fix mobile badge alignment 2020-11-03 18:45:23 +02:00
Henry Jameson
d126eddfca change approach to disable all, enable some 2020-11-03 18:39:46 +02:00
Shpuld Shpludson
22bc0c0840 Merge branch 'svg-logo' into 'develop'
change logo to svg

See merge request pleroma/pleroma-fe!1274
2020-11-03 11:05:33 +00:00
Shpuld Shpuldson
0206b2bcc5 change favicon dimensions for high res, add handling when favicon isn't available 2020-11-03 11:55:29 +02:00
Henry Jameson
979efb301a fix mobile navbar hitboxes 2020-11-03 11:37:11 +02:00
Shpuld Shpuldson
19fd1d4a1e remove the favicon changes 2020-11-03 10:29:03 +02:00
Henry Jameson
e351665bb3 Instead of blocking all interaction, only block interaction in places
that matter
2020-11-02 23:43:32 +02:00
Henry Jameson
b6a8ca44ef added comment 2020-11-02 21:08:22 +02:00
Henry Jameson
bdf2f36f11 fix chat heading not being aligned and using wrong styles 2020-11-02 21:03:55 +02:00
Henry Jameson
08e6e66642 fix chat badge and unify styles across all badges including follow
request count.
2020-11-02 20:51:38 +02:00
Henry Jameson
3db218dec1 change logo to svg 2020-11-02 19:37:01 +02:00
Shpuld Shpuldson
1fa046126e make badge just a ball, make it use theming 2020-11-02 16:45:15 +02:00
Shpuld Shpuldson
350eb489c2 add favicon badge for unread notifs 2020-11-02 15:46:49 +02:00
HJ
f0a66448ee Merge branch 'chchchchangechangelog' into 'develop'
Update CHANGELOG.md

See merge request pleroma/pleroma-fe!1272
2020-11-02 09:43:44 +00:00
HJ
a1e7852c10 Update CHANGELOG.md 2020-11-02 09:36:23 +00:00
Shpuld Shpludson
5ab1b0ab0e Merge branch 'update-changelog' into 'develop'
update changelog for optimistic chat posting

See merge request pleroma/pleroma-fe!1271
2020-11-02 08:51:40 +00:00
Shpuld Shpuldson
279205ade5 update changelog for optimistic chat posting 2020-11-02 10:42:38 +02:00
HJ
bcb6ee328f Merge branch 'fix/use-ids-for-chat-last-seen' into 'develop'
Fix: Use ids for chat last seen instead of timestamp

See merge request pleroma/pleroma-fe!1270
2020-11-02 08:35:22 +00:00
Shpuld Shpuldson
757706425a fix test 2020-11-02 09:42:09 +02:00
Shpuld Shpuldson
5e8db7ed93 move from using timestamps to ids when tracking last seen in chats 2020-11-02 09:15:13 +02:00
Shpuld Shpludson
5254fdba75 Merge branch 'optimistic-chat-posting' into 'develop'
Optimistic / nonblocking message posting for chats

See merge request pleroma/pleroma-fe!1228
2020-11-02 05:36:42 +00:00
HJ
590f8e1754 Merge branch 'various-css-fixes' into 'develop'
Various css fixes

Closes #992

See merge request pleroma/pleroma-fe!1267
2020-11-01 20:50:02 +00:00
Eugenij
78e5a63922 Apply 1 suggestion(s) to 1 file(s) 2020-11-01 23:36:58 +03:00
eugenijm
e798e9a417 Optimistic message sending for chat 2020-11-01 23:36:58 +03:00
Shpuld Shpludson
148789767a Merge branch 'fix/chat-misc-fixes' into 'develop'
Misc Chat fixes

See merge request pleroma/pleroma-fe!1265
2020-11-01 17:50:43 +00:00
Shpuld Shpludson
40ce3a9bd8 Merge branch 'fix/block-misclicks-when-timeline-shifts' into 'develop'
block clicks for a second on timeline when timeline moves

See merge request pleroma/pleroma-fe!1266
2020-11-01 17:44:16 +00:00
HJ
8ae77e14d0 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1264
2020-11-01 15:18:08 +00:00
Henry Jameson
64da9a8e69 fix build warnings 2020-11-01 16:47:17 +02:00
Henry Jameson
8b1213ea1e lint 2020-11-01 16:44:57 +02:00
Henry Jameson
994b49ddfe Merge remote-tracking branch 'origin/develop' into various-css-fixes
* origin/develop:
  remove 'md' size that doesn't exist
2020-11-01 16:44:15 +02:00
Henry Jameson
02bb015c4f fix #992 2020-11-01 16:40:23 +02:00
Tirifto
4cf4de8d28 Translated using Weblate (Esperanto)
Currently translated at 100.0% (669 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2020-11-01 14:33:22 +00:00
Tirifto
5095143c47 Translated using Weblate (Esperanto)
Currently translated at 99.1% (663 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2020-11-01 14:33:22 +00:00
Tirifto
1c7ec321d9 Translated using Weblate (Esperanto)
Currently translated at 98.9% (662 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2020-11-01 14:33:22 +00:00
Kana
599256a6be Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (668 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-11-01 14:33:22 +00:00
Kana
66d07b6d08 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (668 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-11-01 14:33:22 +00:00
Kana
ea300a7a1c Translated using Weblate (Chinese (Traditional))
Currently translated at 99.8% (668 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2020-11-01 14:33:22 +00:00
Kana
891593169f Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (668 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-11-01 14:33:22 +00:00
Tirifto
6040c1ebfc Translated using Weblate (Esperanto)
Currently translated at 98.2% (657 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2020-11-01 14:33:22 +00:00
Tirifto
9d1d695627 Translated using Weblate (Esperanto)
Currently translated at 97.7% (654 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2020-11-01 14:33:22 +00:00
HJ
918563d15c Merge branch 'fix/extra-buttons-icon-errors' into 'develop'
Fix errors: remove 'md' size that doesn't exist

See merge request pleroma/pleroma-fe!1268
2020-11-01 14:33:14 +00:00
Shpuld Shpuldson
8c5586dda4 remove 'md' size that doesn't exist 2020-11-01 11:53:20 +02:00
Henry Jameson
fb00f8459c fix chat count 2020-10-31 13:59:58 +02:00
Henry Jameson
0653f18994 fix play-on-hover gifs issues 2020-10-29 22:54:28 +02:00
Henry Jameson
4e1f2aeabc fix preview spinner 2020-10-29 22:54:28 +02:00
Henry Jameson
633349ddff Refactor desktop navbar into a component, change layout to grid for
better compatibility with search field and simpler CSS
2020-10-29 22:54:28 +02:00
Henry Jameson
0f8a7037ea fix lain's issue in reaction picker 2020-10-29 20:06:13 +02:00
Henry Jameson
8225717a7c Update and fix avatar shadow in user card 2020-10-29 20:03:53 +02:00
Shpuld Shpuldson
3ead79ddb4 document thie this. check 2020-10-29 12:45:44 +02:00
Shpuld Shpuldson
6acb61f296 fix conflict, keep the touchable button big 2020-10-29 08:55:54 +02:00
Shpuld Shpuldson
93f9ab6f2b Merge branch 'fix/block-misclicks-when-timeline-shifts' of git.pleroma.social:pleroma/pleroma-fe into fix/block-misclicks-when-timeline-shifts 2020-10-29 08:37:31 +02:00
Shpuld Shpuldson
cb3578fcca fix conflicts 2020-10-29 08:36:39 +02:00
HJ
a84db4bd8f Merge branch 'fontawesome5' into 'develop'
FontAwesome 5

Closes #982

See merge request pleroma/pleroma-fe!1260
2020-10-28 21:21:35 +00:00
Henry Jameson
ef36ca44f6 >boxes 2020-10-28 22:52:20 +02:00
Henry Jameson
2e6c51dfd4 better icon for picker 2020-10-28 22:49:53 +02:00
Henry Jameson
0ac9d81788 fix settings tabs on mobile, update follow request badge 2020-10-28 21:55:08 +02:00
Henry Jameson
fc7dfb3b9e update & unify the navbars heights 2020-10-28 21:47:42 +02:00
Henry Jameson
7c4af4ce3f improved side-drawer alignments 2020-10-28 21:41:42 +02:00
Henry Jameson
b6cf2bcefd improved the semantics for our icon scale, fixed preview, fixed navbar desktop 2020-10-28 21:31:16 +02:00
Shpuld Shpludson
6d7ecd7d80 Apply 1 suggestion(s) to 1 file(s) 2020-10-28 10:02:51 +00:00
Shpuld Shpuldson
7007659e05 change input blocking to use css 2020-10-28 08:53:23 +02:00
Shpuld Shpuldson
24d85ce6dc update changelog 2020-10-27 13:24:05 +02:00
Shpuld Shpuldson
85dc4002a1 update changelog 2020-10-27 13:17:49 +02:00
Shpuld Shpuldson
1403f20f9f block clicks for a second when timeline moves 2020-10-27 12:59:50 +02:00
Shpuld Shpuldson
2c441c7922 fix back button size, fix missing chat notifications being marked as read too eagerly, fix promiseinterval erroring when not getting a promise 2020-10-27 10:03:04 +02:00
HJ
e2c4816feb Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1262
2020-10-22 18:53:25 +00:00
shironeko
22f3801be7 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (668 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-22 18:25:04 +00:00
Shpuld Shpludson
9ef4d473cb Merge branch 'fixlainsissueforgood' into 'develop'
make subjectline input use size=1 for compatibility with CJK fonts

Closes #922

See merge request pleroma/pleroma-fe!1261
2020-10-21 06:18:25 +00:00
Henry Jameson
048e67f5fc make subjectline input use size=1 for compatibility with CJK fonts 2020-10-21 02:07:05 +03:00
Henry Jameson
eb04ed865e fontello aftermath 2020-10-21 01:56:21 +03:00
Henry Jameson
1b50d700aa bye bye fontello 2020-10-21 00:34:42 +03:00
Henry Jameson
f561e75553 lint 2020-10-21 00:31:16 +03:00
Henry Jameson
1ec41302f7 rotate the shackle of the lock for better accessibility 2020-10-21 00:28:24 +03:00
Henry Jameson
6aa7445ea7 come on and slam 2020-10-21 00:25:59 +03:00
Henry Jameson
7495c6b698 fix attachment remove pointer 2020-10-21 00:02:58 +03:00
Henry Jameson
a50cd7e37d remaining changes... 2020-10-21 00:01:28 +03:00
Henry Jameson
3cbaa00449 more replacements + small renames 2020-10-20 22:54:43 +03:00
Henry Jameson
b19c2eb0fb More stuff. Buttons in user card's corner now have MUCH bigger hitboxes 2020-10-20 22:13:19 +03:00
Henry Jameson
046c60cb61 cancel -> times 2020-10-20 21:18:23 +03:00
Henry Jameson
e8650d3409 chevrons-downs, settings 2020-10-20 21:03:46 +03:00
Henry Jameson
8b3a7ae8c0 more FA5 stuff with small related refactoring 2020-10-20 20:28:11 +03:00
Henry Jameson
3814218277 Some initial work on replacing icons with FA5 2020-10-20 20:28:11 +03:00
HJ
350f25016f Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1259
2020-10-20 17:24:49 +00:00
Marcin Mikołajczak
cf65ecb99d Translated using Weblate (Polish)
Currently translated at 100.0% (669 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pl/
2020-10-20 15:56:12 +00:00
HJ
f31df6406a Merge branch 'docs_split_up_user_guide' into 'develop'
DOCS: Split up user guide

See merge request pleroma/pleroma-fe!1179
2020-10-20 10:45:05 +00:00
Ilja
54987b0bc8 Split up user guide
* I split up the user guide into seperate section to make it more clear/orderly
* I added a general overview page for the FE from where it links to the other sections that give more detailed information
* I updated outdated information and added new information where I felt was required
* I fixed broken links in other parts of the docs as well
2020-10-20 10:45:05 +00:00
HJ
750680d1d8 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1258
2020-10-20 09:27:01 +00:00
Kana
4835f567d4 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.7% (667 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-18 10:46:51 +00:00
Ben Is
81a59feab1 Translated using Weblate (Italian)
Currently translated at 100.0% (669 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2020-10-17 19:40:44 +00:00
Henry Jameson
e695506c51 proper modified icon + popup 2020-10-17 22:28:49 +03:00
Henry Jameson
a664fde02f Merge remote-tracking branch 'origin/develop' into settings-changed
* origin/develop:
  fix fontello
  Translated using Weblate (Russian)
  Translated using Weblate (Italian)
  lint fix
  fixed copy-pasting leftovers
  improved algorithm, possibly speed too
  fix 8x spaces inside this paren
  feat/reorder-emojis-by-position-of-keyword
  rename to gravestone
  Apply 1 suggestion(s) to 1 file(s)
  change i18n phrasing
  separate reply button to its own component, add changelog entry
  add basic deletes support that works with masto WS
2020-10-17 21:26:13 +03:00
HJ
76a9a51620 Merge branch 'fixfontello' into 'develop'
fix fontello

See merge request pleroma/pleroma-fe!1256
2020-10-17 18:25:14 +00:00
Henry Jameson
c7dddb1ec3 fix fontello 2020-10-17 21:09:51 +03:00
Henry Jameson
29ff0be92c Merge remote-tracking branch 'origin/develop' into settings-changed
* origin/develop: (48 commits)
  fix/leftover-emoji-checkboxes-in-settings
  Apply 1 suggestion(s) to 1 file(s)
  Translated using Weblate (Spanish)
  Translated using Weblate (Persian)
  Translated using Weblate (Persian)
  Translated using Weblate (Polish)
  update changelog
  Stop click propagation when unhiding nsfw
  Fix Follow Requests title style
  Translated using Weblate (Persian)
  Translated using Weblate (Persian)
  Translated using Weblate (French)
  Added translation using Weblate (Persian)
  Translated using Weblate (Chinese (Traditional))
  Translated using Weblate (Chinese (Simplified))
  Translated using Weblate (Italian)
  Translated using Weblate (English)
  Translated using Weblate (English)
  Translated using Weblate (Basque)
  Translated using Weblate (Spanish)
  ...
2020-10-17 19:24:07 +03:00
HJ
4df033a3ba Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1254
2020-10-16 20:54:14 +00:00
Anonymous
85326ee9e2 Translated using Weblate (Russian)
Currently translated at 55.0% (368 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ru/
2020-10-16 20:41:05 +00:00
Ben Is
def04380da Translated using Weblate (Italian)
Currently translated at 100.0% (669 of 669 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2020-10-16 20:41:03 +00:00
Shpuld Shpludson
0e14cd6102 Merge branch 'feat/reorder-emojis-by-position-of-keyword' into 'develop'
feat/reorder-emojis-by-position-of-keyword

See merge request pleroma/pleroma-fe!1240
2020-10-13 15:00:06 +00:00
Shpuld Shpludson
d86cd3e850 Merge branch 'feat/masto-ws-deletes' into 'develop'
Support for WS deletes

See merge request pleroma/pleroma-fe!1227
2020-10-12 06:05:21 +00:00
HJ
3ca729d098 Merge branch 'fix/leftover-emoji-checkboxes-in-settings' into 'develop'
fix/leftover-emoji-checkboxes-in-settings

See merge request pleroma/pleroma-fe!1248
2020-10-11 18:00:13 +00:00
Dym Sohin
e5bd1c20b0 fix/leftover-emoji-checkboxes-in-settings 2020-10-11 02:03:45 +02:00
Shpuld Shpludson
069a4b0801 Merge branch 'fix/nsfw-hider-closing-preview' into 'develop'
Stop click propagation when unhiding nsfw

See merge request pleroma/pleroma-fe!1245
2020-10-09 16:15:30 +00:00
Shpuld Shpludson
e7a67e33ad Merge branch 'fix/follow-requests-title' into 'develop'
Fix Follow Requests title style

See merge request pleroma/pleroma-fe!1243
2020-10-09 16:14:43 +00:00
HJ
6a3c775006 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1232
2020-10-08 15:49:27 +00:00
feld
09da102a4c Apply 1 suggestion(s) to 1 file(s) 2020-10-06 16:18:30 +00:00
tarteka
20bdf32658 Translated using Weblate (Spanish)
Currently translated at 100.0% (668 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2020-10-06 15:28:18 +00:00
nickiii
ba25c618cc Translated using Weblate (Persian)
Currently translated at 15.1% (101 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fa/
2020-10-05 11:43:55 +00:00
nickiii
0042cf3809 Translated using Weblate (Persian)
Currently translated at 15.1% (101 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fa/
2020-10-04 23:08:33 +00:00
Jędrzej Tomaszewski
3e86b891e1 Translated using Weblate (Polish)
Currently translated at 100.0% (668 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pl/
2020-10-02 18:39:51 +00:00
Shpuld Shpuldson
6cf15dce96 update changelog 2020-10-02 12:23:04 +03:00
Shpuld Shpuldson
a0da6c31d9 Stop click propagation when unhiding nsfw 2020-10-02 12:21:56 +03:00
Mark Felder
ff2fe5c68c Fix Follow Requests title style 2020-10-01 17:05:46 -05:00
nickiii
6dec154450 Translated using Weblate (Persian)
Currently translated at 2.6% (18 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fa/
2020-10-01 13:20:25 +00:00
nickiii
b12b6a84a4 Translated using Weblate (Persian)
Currently translated at 2.5% (17 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fa/
2020-10-01 13:20:25 +00:00
Haelwenn (lanodan) Monnier
14dc0eef3b Translated using Weblate (French)
Currently translated at 92.0% (615 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2020-10-01 13:20:25 +00:00
nickiii
7e4d1b0abb Added translation using Weblate (Persian) 2020-10-01 13:20:25 +00:00
Snow
dff7e38154 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (668 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2020-10-01 13:20:25 +00:00
Snow
f110258fa1 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.6% (659 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-01 13:20:25 +00:00
Ben Is
71fca987a8 Translated using Weblate (Italian)
Currently translated at 100.0% (668 of 668 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/
2020-10-01 13:20:25 +00:00
hj
e9f13895b9 Translated using Weblate (English)
Currently translated at 100.0% (661 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/en/
2020-10-01 13:20:25 +00:00
Not HJ
d11ecc5987 Translated using Weblate (English)
Currently translated at 100.0% (661 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/en/
2020-10-01 13:20:25 +00:00
tarteka
38fa2111f9 Translated using Weblate (Basque)
Currently translated at 83.3% (551 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2020-10-01 13:20:25 +00:00
tarteka
c9033e0351 Translated using Weblate (Spanish)
Currently translated at 100.0% (661 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2020-10-01 13:20:25 +00:00
tarteka
f10abd29f0 Translated using Weblate (Basque)
Currently translated at 77.6% (513 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2020-10-01 13:20:25 +00:00
Kana
cd6adac59a Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (659 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-01 13:20:25 +00:00
Kana
fffce4aa98 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (659 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-01 13:20:25 +00:00
Snow
14a2328b85 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (661 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2020-10-01 13:20:25 +00:00
Snow
b3e1cb81a3 Translated using Weblate (Chinese (Traditional))
Currently translated at 72.1% (477 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2020-10-01 13:20:25 +00:00
Kana
970bfa2bdd Translated using Weblate (Chinese (Simplified))
Currently translated at 97.7% (646 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-01 13:20:25 +00:00
Kana
beec425cce Translated using Weblate (Chinese (Simplified))
Currently translated at 90.4% (598 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-01 13:20:25 +00:00
Snow
c55e09a513 Translated using Weblate (Chinese (Traditional))
Currently translated at 67.1% (444 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2020-10-01 13:20:25 +00:00
Kana
887ff4dec3 Translated using Weblate (Chinese (Simplified))
Currently translated at 90.0% (595 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-01 13:20:25 +00:00
snow
32ddb38736 Translated using Weblate (Chinese (Traditional))
Currently translated at 18.9% (125 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/
2020-10-01 13:20:25 +00:00
snow
ad6b7148d4 Translated using Weblate (Chinese (Simplified))
Currently translated at 83.2% (550 of 661 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2020-10-01 13:20:25 +00:00
snow
aca8570b86 Added translation using Weblate (Chinese (Traditional)) 2020-10-01 13:20:25 +00:00
titizen
3f119c6875 Translated using Weblate (Catalan)
Currently translated at 48.7% (323 of 662 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/
2020-10-01 13:20:25 +00:00
Shpuld Shpludson
6bd38c7d6f Merge branch 'fix/wait-for-request-before-starting-interval' into 'develop'
Fix/wait for request before starting interval - fix #937

Closes #937

See merge request pleroma/pleroma-fe!1222
2020-10-01 13:20:14 +00:00
Shpuld Shpuldson
414558665f lint fix 2020-10-01 16:01:57 +03:00
Shpuld Shpludson
8a34ff2957 Merge branch 'develop' into 'feat/masto-ws-deletes'
# Conflicts:
#   CHANGELOG.md
#   src/components/status/status.js
#   src/components/status/status.scss
2020-10-01 12:54:54 +00:00
Henry Jameson
a463959a36 Initial work on highlighting changed settings. Some refactoring to
simplify addition of new settings
2020-10-01 01:43:07 +03:00
Shpuld Shpludson
68c2a5b18f Merge branch 'fix/excessive-underline-in-sidebar' into 'develop'
fix excessive underline in sidebar

See merge request pleroma/pleroma-fe!1238
2020-09-30 06:59:09 +00:00
Dym Sohin
c17012cfe1 fix appended 0.65em on wrong line 2020-09-29 13:20:16 +02:00
Dym Sohin
1675f1a133 scoped back margin-right on icons 2020-09-29 13:13:42 +02:00
Shpuld Shpludson
91778a0276 Merge branch 'feat/custom-virtual-scrolling' into 'develop'
Timeline virtual scrolling

See merge request pleroma/pleroma-fe!1043
2020-09-29 10:18:37 +00:00
Shpuld Shpludson
f174f289a9 Timeline virtual scrolling 2020-09-29 10:18:37 +00:00
Shpuld Shpludson
3781e521e6 Merge branch 'feature/import_export_mutes' into 'develop'
[#2099] Added import/export mutes [FE]

See merge request pleroma/pleroma-fe!1229
2020-09-29 08:18:02 +00:00
Shpuld Shpludson
787f52e06e Merge branch 'remove-bio-tables-max-width' into 'develop'
remove bio-table's max-width

See merge request pleroma/pleroma-fe!1241
2020-09-29 06:19:20 +00:00
Dym Sohin
3dacef944c remove bio-table's max-width 2020-09-24 12:05:51 +02:00
Dym Sohin
bb59b8ee56 fixed copy-pasting leftovers 2020-09-21 18:13:31 +02:00
Dym Sohin
cff202241b improved algorithm, possibly speed too 2020-09-21 18:10:55 +02:00
Dym Sohin
f1e1f20a8d fix 8x spaces inside this paren 2020-09-21 17:42:17 +02:00
Dym Sohin
fee654f1ee feat/reorder-emojis-by-position-of-keyword 2020-09-21 17:29:36 +02:00
HJ
0c0722a092 Merge branch 'fix/overflow-for-chat-unread' into 'develop'
fix/overflow-for-chat-unread

See merge request pleroma/pleroma-fe!1239
2020-09-19 19:59:57 +00:00
Dym Sohin
20362546d1 fix/overflow-for-chat-unread 2020-09-19 21:50:56 +02:00
Dym Sohin
f9977dbb3c fix excessive underline in sidebar 2020-09-19 21:28:03 +02:00
Maksim Pechnikov
5942001626 updated changelog 2020-09-18 22:09:05 +03:00
Maksim Pechnikov
3dbc1bedbf Merge branch 'develop' into feature/import_export_mutes 2020-09-18 22:04:01 +03:00
Maksim Pechnikov
b725df6352 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-09-18 22:03:11 +03:00
HJ
0fee9a8fe7 Merge branch 'fix/case--in-sensitive--emoji--search' into 'develop'
fix case in/sensitive emoji search

See merge request pleroma/pleroma-fe!1237
2020-09-18 09:37:17 +00:00
Dym Sohin
70a5619496 [fix] case in/sensitive emoji search 2020-09-18 11:07:38 +02:00
lain
ee620f6028 Merge branch 'fix/use-shoutbox-name-in-sidedrawer' into 'develop'
change side drawer to use shoutbox name - fix #956

Closes #956

See merge request pleroma/pleroma-fe!1235
2020-09-16 09:22:05 +00:00
Shpuld Shpuldson
20d33c2fbc change icon to a megaphone 2020-09-16 11:53:54 +03:00
Shpuld Shpuldson
1b811d8b93 change side drawer to use shoutbox name 2020-09-16 11:29:10 +03:00
Shpuld Shpuldson
d6fe4f6a4f update changelog 2020-09-16 10:27:31 +03:00
Shpuld Shpludson
38189ee838 Merge branch 'fix-chat-message-list-fetch' into 'develop'
Fix chat messages being missed sometimes when the streaming is disabled and the messages are sent by both participants simultaneously

Closes #957

See merge request pleroma/pleroma-fe!1233
2020-09-16 07:13:31 +00:00
Shpuld Shpludson
c00c20a31f Merge branch 'fix-chat-list-order' into 'develop'
Fix the chat list order update

Closes #955

See merge request pleroma/pleroma-fe!1234
2020-09-16 06:59:04 +00:00
eugenijm
8c4514013d Fix chat messages being missed when the streaming is disabled and the messages are sent by both participants simultaneously 2020-09-16 09:21:24 +03:00
eugenijm
92caaa2d7f Fix the chat list order and last message timestamp updates 2020-09-16 05:10:09 +03:00
Shpuld Shpludson
679a1f5e1c Merge branch 'fix/fix-vue-errors' into 'develop'
fix vue warnings and errors

See merge request pleroma/pleroma-fe!1230
2020-09-09 10:21:54 +00:00
Shpuld Shpuldson
afb2241a5b change a eslint disable to nextline only 2020-09-08 16:29:10 +03:00
Shpuld Shpuldson
8975589bca fix vue warnings and errors 2020-09-08 10:44:08 +03:00
Maksim Pechnikov
947d7cd6f2 added import/export mutes 2020-09-08 09:41:42 +03:00
Shpuld Shpuldson
fa91766519 rename to gravestone 2020-09-08 09:32:43 +03:00
Shpuld Shpludson
1ec9cde963 Apply 1 suggestion(s) to 1 file(s) 2020-09-08 06:31:02 +00:00
Shpuld Shpludson
da63894072 Merge branch 'weblate-pleroma-pleroma-fe' into 'develop'
Translations update from Weblate

See merge request pleroma/pleroma-fe!1226
2020-09-07 08:11:54 +00:00
tarteka
26c42484f0 Translated using Weblate (Basque)
Currently translated at 77.4% (513 of 662 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/
2020-09-07 08:01:49 +00:00
tarteka
002cd61353 Translated using Weblate (Spanish)
Currently translated at 100.0% (662 of 662 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2020-09-07 08:01:49 +00:00
Anonymous
a0aa45d328 Translated using Weblate (Spanish)
Currently translated at 83.2% (551 of 662 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2020-09-07 08:01:48 +00:00
tarteka
31a9da05ff Translated using Weblate (Spanish)
Currently translated at 83.2% (551 of 662 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/
2020-09-07 08:01:48 +00:00
Shpuld Shpludson
8a0f280cd8 Merge branch 'chat-desktop-notifications-fix' into 'develop'
Do not show desktop notifications for your own chat messages

Closes #951

See merge request pleroma/pleroma-fe!1225
2020-09-07 08:01:06 +00:00
Shpuld Shpuldson
0758569625 change i18n phrasing 2020-09-07 10:39:30 +03:00
Shpuld Shpuldson
f9ac23b9a9 separate reply button to its own component, add changelog entry 2020-09-07 10:35:49 +03:00
Maksim Pechnikov
fa2b680855 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-09-07 09:47:17 +03:00
Shpuld Shpuldson
40ca0b394e add basic deletes support that works with masto WS 2020-09-06 15:28:09 +03:00
eugenijm
b8afdb4c02 Do not show desktop notifications for your own chat messages 2020-09-04 23:11:10 +03:00
Shpuld Shpludson
e331db79e5 Merge branch 'develop' into 'fix/wait-for-request-before-starting-interval'
# Conflicts:
#   CHANGELOG.md
2020-09-04 08:38:13 +00:00
Shpuld Shpuldson
c89ac79140 fix chat fetcher stops, change fetcher code 2020-09-04 11:22:14 +03:00
Shpuld Shpuldson
3fb35e8123 rename to promiseInterval 2020-09-04 11:19:53 +03:00
Shpuld Shpludson
a73b09c732 Merge branch 'fix/locked-account-link-fix' into 'develop'
Open profile tab from 'locked' link in FO-post warning - Fix #945

Closes #945

See merge request pleroma/pleroma-fe!1223
2020-09-04 08:11:31 +00:00
Shpuld Shpuldson
f281663b49 Add hacky functionality to open specific settings tabs 2020-09-03 15:45:13 +03:00
Shpuld Shpuldson
5b403ba7d1 fix timeline showimmediately being set wrongly 2020-09-02 22:12:50 +03:00
Shpuld Shpuldson
4d080a1654 add mention to changelog 2020-09-02 21:26:02 +03:00
Shpuld Shpuldson
d939f2ffbc document makeFetcher a bit 2020-09-02 21:08:06 +03:00
Shpuld Shpuldson
1b6eee0497 change chats to use custom makeFetcher 2020-09-02 21:01:31 +03:00
Shpuld Shpuldson
2d914c331e replace setInterval for timelne, notifications and follow requests 2020-09-02 20:40:47 +03:00
Maksim Pechnikov
12519a54b5 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-06-29 09:16:00 +03:00
Maksim Pechnikov
08444c3903 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-06-18 08:47:50 +03:00
Maksim Pechnikov
e3d0b2f137 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-02-13 09:32:45 +03:00
Maksim Pechnikov
a52ae1ebeb Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-02-10 21:09:36 +03:00
Maksim Pechnikov
64c180c838 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-02-04 10:07:20 +03:00
Maksim Pechnikov
f892b26d73 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-01-14 22:08:24 +03:00
Maksim Pechnikov
40c4a49223 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-01-14 16:14:51 +03:00
Maksim Pechnikov
99db89fa17 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-01-13 14:45:43 +03:00
Maksim Pechnikov
2810f10d14 Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into develop 2020-01-06 15:47:36 +03:00
Maksim Pechnikov
50bb8865c5 dd 2019-12-18 21:17:06 +03:00
364 changed files with 30682 additions and 10590 deletions

View file

@ -1,5 +1,5 @@
{ {
"presets": ["@babel/preset-env"], "presets": ["@babel/preset-env"],
"plugins": ["@babel/plugin-transform-runtime", "lodash", "@vue/babel-plugin-transform-vue-jsx"], "plugins": ["@babel/plugin-transform-runtime", "lodash", "@vue/babel-plugin-jsx"],
"comments": false "comments": false
} }

View file

@ -1,7 +1,7 @@
# This file is a template, and might need editing before it works on your project. # This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at: # Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/node/tags/ # https://hub.docker.com/r/library/node/tags/
image: node:10 image: node:12
stages: stages:
- lint - lint

1
.mailmap Normal file
View file

@ -0,0 +1 @@
rinpatch <rin@patch.cx> <rinpatch@sdf.org>

View file

@ -3,16 +3,185 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased] ## Unreleased
## [Unreleased patch] ### Fixed
- AdminFE button no longer scrolls page to top when clicked
- Pinned statuses no longer appear at bottom of user timeline (still appear as part of the timeline when fetched deep enough)
- Fixed many many bugs related to new mentions, including spacing and alignment issues
- Links in profile bios now properly open in new tabs
- Inline images now respect their intended width/height attributes
- Links with `&` in them work properly now
- Interaction list popovers now properly emojify names
- Completely hidden posts still had 1px border
- Attachments are ALWAYS in same order as user uploaded, no more "videos first"
- Attachment description is prefilled with backend-provided default when uploading
- Proper visual feedback that next image is loading when browsing
### Changed
- (You)s are optional (opt-in) now, bolding your nickname is also optional (opt-out)
- User highlight background now also covers the `@`
- Reverted back to textual `@`, svg version is opt-in.
- Settings window has been throughly rearranged to make make more sense and make navication settings easier.
- Uploaded attachments are uniform with displayed attachments
- Flash is watchable in media-modal (takes up nearly full screen though due to sizing issues)
- Notifications about likes/repeats/emoji reacts are now minimized so they always take up same amount of space irrelevant to size of post.
### Added
- Options to show domains in mentions
- Option to show user avatars in mention links (opt-in)
- Option to disable the tooltip for mentions
- Option to completely hide muted threads
- Ability to open videos in modal even if you disabled that feature, via an icon button
- New button on attachment that indicates that attachment has a description and shows a bar filled with description
- Attachments are truncated just like post contents
- Media modal now also displays description and counter position in gallery (i.e. 1/5)
- Ability to rearrange order of attachments when uploading
- Enabled users to zoom and pan images in media viewer with mouse and touch
## [2.4.2] - 2022-01-09
### Added
- Added Apply and Reset buttons to the bottom of theme tab to minimize UI travel
- Implemented user option to always show floating New Post button (normally mobile-only)
- Display reasons for instance specific policies
- Added functionality to cancel follow request
### Fixed
- Fixed link to external profile not working on user profiles
- Fixed mobile shoutbox display
- Fixed favicon badge not working in Chrome
- Escape html more properly in subject/display name
## [2.4.0] - 2021-08-08
### Added
- Added a quick settings to timeline header for easier access
- Added option to mark posts as sensitive by default
- Added quick filters for notifications
- Implemented user option to change sidebar position to the right side
- Implemented user option to hide floating shout panel
- Implemented "edit profile" button if viewing own profile which opens profile settings
### Fixed
- Fixed follow request count showing in the wrong location in mobile view
## [2.3.0] - 2021-03-01
### Fixed
- Button to remove uploaded media in post status form is now properly placed and sized.
- Fixed shoutbox not working in mobile layout
- Fixed missing highlighted border in expanded conversations again
- Fixed some UI jumpiness when opening images particularly in chat view
- Fixed chat unread badge looking weird
- Fixed punycode names not working properly
- Fixed notifications crashing on an invalid notification
### Changed
- Display 'people voted' instead of 'votes' for multi-choice polls
- Changed the "Timelines" link in side panel to toggle show all timeline options inside the panel
- Renamed "Timeline" to "Home Timeline" to be more clear
- Optimized chat to not get horrible performance after keeping the same chat open for a long time
- When opening emoji picker or react picker, it automatically focuses the search field
- Language picker now uses native language names
### Added
- Added reason field for registration when approval is required
- Group staff members by role in the About page
## [2.2.3] - 2021-01-18
### Added
- Added Report button to status ellipsis menu for easier reporting
### Fixed
- Follows/Followers tabs on user profiles now display the content properly.
- Handle punycode in screen names
- Fixed local dev mode having non-functional websockets in some cases
- Show notices for websocket events (errors, abnormal closures, reconnections)
- Fix not being able to re-enable websocket until page refresh
- Fix annoying issue where timeline might have few posts when streaming is enabled
### Changed
- Don't filter own posts when they hit your wordfilter
## [2.2.2] - 2020-12-22
### Added
- Mouseover titles for emojis in reaction picker
- Support to input emoji into the search box in reaction picker
- Added some missing unicode emoji
- Added the upload limit to the Features panel in the About page
- Support for solid color wallpaper, instance doesn't have to define a wallpaper anymore
### Fixed
- Fixed the occasional bug where screen would scroll 1px when typing into a reply form
- Fixed timeline errors locking timelines
- Fixed missing highlighted border in expanded conversations
- Fixed custom emoji not working in profile field names
- Fixed pinned statuses not appearing in user profiles
- Fixed some elements not being keyboard navigation friendly
- Fixed error handling when updating various profile images
- Fixed your latest chat messages disappearing when closing chat view and opening it again during the same session
- Fixed custom emoji not showing in poll options before voting
- Fixed link color not applied to instance name in topbar
### Changed
- Errors when fetching are now shown with popup errors instead of "Error fetching updates" in panel headers
- Made reply/fav/repeat etc buttons easier to hit
- Adjusted timeline menu clickable area to match the visible button
- Moved external source link from status heading to the ellipsis menu
- Disabled horizontal textarea resize
- Wallpaper is now top-aligned, horizontally centered.
## [2.2.1] - 2020-11-11
### Fixed
- Fixed regression in react popup alignment and overflowing
## [2.2.0] - 2020-11-06
### Added
- New option to optimize timeline rendering to make the site more responsive (enabled by default)
- New instance option `logoLeft` to move logo to the left side in desktop nav bar
- Import/export a muted users
- Proper handling of deletes when using websocket streaming
- Added optimistic chat message sending, so you can start writing next message before the previous one has been sent
- Added a small red badge to the favicon when there's unread notifications
- Added the NSFW alert to link previews
### Fixed
- Fixed clicking NSFW hider through status popover
- Fixed chat-view back button being hard to click
- Fixed fresh chat notifications being cleared immediately while leaving the chat view and not having time to actually see the messages
- Fixed multiple regressions in CSS styles
- Fixed multiple issues with input fields when using CJK font as default
- Fixed search field in navbar infringing into logo in some cases
- Fixed not being able to load the chat history in vertical screens when the message list doesn't take the full height of the scrollable container on the first fetch.
### Changed
- Clicking immediately when timeline shifts is now blocked to prevent misclicks
- Icons changed from fontello (FontAwesome 4 + others) to FontAwesome 5 due to problems with fontello.
- Some icons changed for better accessibility (lock, globe)
- Logo is now clickable
- Changed default logo to SVG version
## [2.1.2] - 2020-09-17
### Fixed
- Fixed chats list not updating its order when new messages come in
- Fixed chat messages sometimes getting lost when you receive a message at the same time
## [2.1.1] - 2020-09-08
### Changed ### Changed
- Polls will be hidden with status content if "Collapse posts with subjects" is enabled and the post is collapsed. - Polls will be hidden with status content if "Collapse posts with subjects" is enabled and the post is collapsed.
### Fixed ### Fixed
- Network fetches don't pile up anymore but wait for previous ones to finish to reduce throttling.
- Autocomplete won't stop at the second @, so it'll still work with "@lain@l" and not start over. - Autocomplete won't stop at the second @, so it'll still work with "@lain@l" and not start over.
- Fixed weird autocomplete behavior when you write ":custom_emoji: ?" - Fixed weird autocomplete behavior when you write ":custom_emoji: ?"
## [2.1.0] - 2020-08-28 ## [2.1.0] - 2020-08-28
### Added ### Added
- Autocomplete domains from list of known instances - Autocomplete domains from list of known instances
@ -128,8 +297,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Ability to change user's email - Ability to change user's email
- About page - About page
- Added remote user redirect - Added remote user redirect
- Bookmarks
### Changed ### Changed
- changed the way fading effects for user profile/long statuses works, now uses css-mask instead of gradient background hacks which weren't exactly compatible with semi-transparent themes - changed the way fading effects for user profile/long statuses works, now uses css-mask instead of gradient background hacks which weren't exactly compatible with semi-transparent themes
### Fixed ### Fixed
- improved hotkey behavior on autocomplete popup - improved hotkey behavior on autocomplete popup

View file

@ -3,6 +3,7 @@ Contributors of this project.
- Constance Variable (lambadalambda@social.heldscal.la): Code - Constance Variable (lambadalambda@social.heldscal.la): Code
- Coco Snuss (cocosnuss@social.heldscal.la): Code - Coco Snuss (cocosnuss@social.heldscal.la): Code
- wakarimasen (wakarimasen@shitposter.club): NSFW hiding image - wakarimasen (wakarimasen@shitposter.club): NSFW hiding image
- eris (eris@disqordia.space): Code
- dtluna (dtluna@social.heldscal.la): Code - dtluna (dtluna@social.heldscal.la): Code
- sonyam (sonyam@social.heldscal.la): Background images - sonyam (sonyam@social.heldscal.la): Background images
- hakui (hakui@freezepeach.xyz): CSS and styling - hakui (hakui@freezepeach.xyz): CSS and styling

View file

@ -21,6 +21,7 @@ var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, { var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath, publicPath: webpackConfig.output.publicPath,
writeToDisk: true,
stats: { stats: {
colors: true, colors: true,
chunks: false chunks: false

View file

@ -3,7 +3,8 @@ var config = require('../config')
var utils = require('./utils') var utils = require('./utils')
var projectRoot = path.resolve(__dirname, '../') var projectRoot = path.resolve(__dirname, '../')
var ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin') var ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin')
var FontelloPlugin = require("fontello-webpack-plugin") var CopyPlugin = require('copy-webpack-plugin');
var { VueLoaderPlugin } = require('vue-loader')
var env = process.env.NODE_ENV var env = process.env.NODE_ENV
// check env & config/index.js to decide weither to enable CSS Sourcemaps for the // check env & config/index.js to decide weither to enable CSS Sourcemaps for the
@ -29,16 +30,16 @@ module.exports = {
} }
}, },
resolve: { resolve: {
extensions: ['.js', '.vue'], extensions: ['.js', '.jsx', '.vue'],
modules: [ modules: [
path.join(__dirname, '../node_modules') path.join(__dirname, '../node_modules')
], ],
alias: { alias: {
'vue$': 'vue/dist/vue.runtime.common',
'static': path.resolve(__dirname, '../static'), 'static': path.resolve(__dirname, '../static'),
'src': path.resolve(__dirname, '../src'), 'src': path.resolve(__dirname, '../src'),
'assets': path.resolve(__dirname, '../src/assets'), 'assets': path.resolve(__dirname, '../src/assets'),
'components': path.resolve(__dirname, '../src/components') 'components': path.resolve(__dirname, '../src/components'),
'vue-i18n': 'vue-i18n/dist/vue-i18n.runtime.esm-bundler.js'
} }
}, },
module: { module: {
@ -58,9 +59,28 @@ module.exports = {
} }
} }
}, },
{
enforce: 'post',
test: /\.(json5?|ya?ml)$/, // target json, json5, yaml and yml files
type: 'javascript/auto',
loader: '@intlify/vue-i18n-loader',
include: [ // Use `Rule.include` to specify the files of locale messages to be pre-compiled
path.resolve(__dirname, '../src/i18n')
]
},
{ {
test: /\.vue$/, test: /\.vue$/,
use: 'vue-loader' loader: 'vue-loader',
options: {
compilerOptions: {
isCustomElement(tag) {
if (tag === 'pinch-zoom') {
return true
}
return false
}
}
}
}, },
{ {
test: /\.jsx?$/, test: /\.jsx?$/,
@ -95,13 +115,19 @@ module.exports = {
entry: path.join(__dirname, '..', 'src/sw.js'), entry: path.join(__dirname, '..', 'src/sw.js'),
filename: 'sw-pleroma.js' filename: 'sw-pleroma.js'
}), }),
new FontelloPlugin({ new VueLoaderPlugin(),
config: require('../static/fontello.json'), // This copies Ruffle's WASM to a directory so that JS side can access it
name: 'fontello', new CopyPlugin({
output: { patterns: [
css: 'static/[name].' + now + '.css', // [hash] is not supported. Use the current timestamp instead for versioning. {
font: 'static/font/[name].' + now + '.[ext]' from: "node_modules/ruffle-mirror/*",
} to: "static/ruffle",
flatten: true
},
],
options: {
concurrency: 100,
},
}) })
] ]
} }

View file

@ -21,7 +21,9 @@ module.exports = merge(baseWebpackConfig, {
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': config.dev.env, 'process.env': config.dev.env,
'COMMIT_HASH': JSON.stringify('DEV'), 'COMMIT_HASH': JSON.stringify('DEV'),
'DEV_OVERRIDES': JSON.stringify(config.dev.settings) 'DEV_OVERRIDES': JSON.stringify(config.dev.settings),
'__VUE_OPTIONS_API__': true,
'__VUE_PROD_DEVTOOLS__': false
}), }),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(), new webpack.HotModuleReplacementPlugin(),

View file

@ -36,7 +36,9 @@ var webpackConfig = merge(baseWebpackConfig, {
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': env, 'process.env': env,
'COMMIT_HASH': JSON.stringify(commitHash), 'COMMIT_HASH': JSON.stringify(commitHash),
'DEV_OVERRIDES': JSON.stringify(undefined) 'DEV_OVERRIDES': JSON.stringify(undefined),
'__VUE_OPTIONS_API__': true,
'__VUE_PROD_DEVTOOLS__': false
}), }),
// extract css into its own file // extract css into its own file
new MiniCssExtractPlugin({ new MiniCssExtractPlugin({

View file

@ -3,6 +3,11 @@ const path = require('path')
let settings = {} let settings = {}
try { try {
settings = require('./local.json') settings = require('./local.json')
if (settings.target && settings.target.endsWith('/')) {
// replacing trailing slash since it can conflict with some apis
// and that's how actual BE reports its url
settings.target = settings.target.replace(/\/$/, '')
}
console.log('Using local dev server settings (/config/local.json):') console.log('Using local dev server settings (/config/local.json):')
console.log(JSON.stringify(settings, null, 2)) console.log(JSON.stringify(settings, null, 2))
} catch (e) { } catch (e) {
@ -47,7 +52,10 @@ module.exports = {
target, target,
changeOrigin: true, changeOrigin: true,
cookieDomainRewrite: 'localhost', cookieDomainRewrite: 'localhost',
ws: true ws: true,
headers: {
'Origin': target
}
}, },
'/oauth/revoke': { '/oauth/revoke': {
target, target,

View file

@ -1,13 +1,13 @@
# Pleroma-FE configuration and customization for instance administrators # Pleroma-FE configuration and customization for instance administrators
* *For user configuration, see [Pleroma-FE user guide](USER_GUIDE.md)* * *For user configuration, see [Pleroma-FE user guide](../user_guide)*
* *For local development server configuration, see [Hacking, tweaking, contributing](HACKING.md)* * *For local development server configuration, see [Hacking, tweaking, contributing](HACKING.md)*
## Where configuration is stored ## Where configuration is stored
PleromaFE gets its configuration from several sources, in order of preference (the one above overrides ones below it) PleromaFE gets its configuration from several sources, in order of preference (the one above overrides ones below it)
1. `/api/statusnet/config.json` - this is generated on Backend and contains multiple things including instance name, char limit etc. It also contains FE/Client-specific data, PleromaFE uses `pleromafe` field of it. For more info on changing config on BE, look [here](https://docs-develop.pleroma.social/config.html#frontend_configurations) 1. `/api/statusnet/config.json` - this is generated on Backend and contains multiple things including instance name, char limit etc. It also contains FE/Client-specific data, PleromaFE uses `pleromafe` field of it. For more info on changing config on BE, look [here](../backend/configuration/cheatsheet.md#frontend_configurations)
2. `/static/config.json` - this is a static FE-provided file, containing only FE specific configuration. This file is completely optional and could be removed but is useful as a fallback if some configuration JSON property isn't present in BE-provided config. It's also a reference point to check what default configuration are and what JSON properties even exist. In local dev mode it could be used to override BE configuration, more about that in HACKING.md. File is located [here](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/static/config.json). 2. `/static/config.json` - this is a static FE-provided file, containing only FE specific configuration. This file is completely optional and could be removed but is useful as a fallback if some configuration JSON property isn't present in BE-provided config. It's also a reference point to check what default configuration are and what JSON properties even exist. In local dev mode it could be used to override BE configuration, more about that in HACKING.md. File is located [here](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/static/config.json).
3. Built-in defaults. Those are hard-coded defaults that are used when `/static/config.json` is not available and BE-provided configuration JSON is missing some JSON properties. ( [Code](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/src/modules/instance.js) ) 3. Built-in defaults. Those are hard-coded defaults that are used when `/static/config.json` is not available and BE-provided configuration JSON is missing some JSON properties. ( [Code](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/src/modules/instance.js) )

View file

@ -25,7 +25,7 @@ This could be a bit trickier, you basically need steps 1-4 from *develop build*
### Replacing your instance's frontend with custom FE build ### Replacing your instance's frontend with custom FE build
This is the most easiest way to use and test FE build: you just need to copy or symlink contents of `dist` folder into backend's [static directory](https://docs.pleroma.social/static_dir.html), by default it is located in `instance/static`, or in `/var/lib/pleroma/static` for OTP release installations, create it if it doesn't exist already. Be aware that running `yarn build` wipes the contents of `dist` folder. This is the most easiest way to use and test FE build: you just need to copy or symlink contents of `dist` folder into backend's [static directory](../backend/configuration/static_dir.md), by default it is located in `instance/static`, or in `/var/lib/pleroma/static` for OTP release installations, create it if it doesn't exist already. Be aware that running `yarn build` wipes the contents of `dist` folder.
### Running production build locally or on a separate server ### Running production build locally or on a separate server
@ -67,9 +67,9 @@ server {
### API, Data, Operations ### API, Data, Operations
In 99% cases PleromaFE uses [MastoAPI](https://docs.joinmastodon.org/api/) with [Pleroma Extensions](https://docs-develop.pleroma.social/differences_in_mastoapi_responses.html) to fetch the data. The rest is either QvitterAPI leftovers or pleroma-exclusive APIs. QvitterAPI doesn't exactly have documentation and uses different JSON structure and sometimes different parameters and workflows, [this](https://twitter-api.readthedocs.io/en/latest/index.html) could be a good reference though. Some pleroma-exclusive API may still be using QvitterAPI JSON structure. In 99% cases PleromaFE uses [MastoAPI](https://docs.joinmastodon.org/api/) with [Pleroma Extensions](../backend/API/differences_in_mastoapi_responses.md) to fetch the data. The rest is either QvitterAPI leftovers or pleroma-exclusive APIs. QvitterAPI doesn't exactly have documentation and uses different JSON structure and sometimes different parameters and workflows, [this](https://twitter-api.readthedocs.io/en/latest/index.html) could be a good reference though. Some pleroma-exclusive API may still be using QvitterAPI JSON structure.
PleromaFE supports both formats by transforming them into internal format which is basically QvitterAPI one with some additions and renaming. All data is passed trough [Entity Normalizer](/src/services/entity_normalizer/entity_normalizer.service.js) which can serve as a reference of API and what's actually used, it's also a host for all the hacks and data transformation. PleromaFE supports both formats by transforming them into internal format which is basically QvitterAPI one with some additions and renaming. All data is passed trough [Entity Normalizer](https://git.pleroma.social/pleroma/pleroma-fe/-/blob/develop/src/services/entity_normalizer/entity_normalizer.service.js) which can serve as a reference of API and what's actually used, it's also a host for all the hacks and data transformation.
For most part, PleromaFE tries to store all the info it can get in global vuex store - every user and post are passed trough updating mechanism where data is either added or merged with existing data, reactively updating the information throughout UI, so if in newest request user's post counter increased, it will be instantly updated in open user profile cards. This is also used to find users, posts and sometimes to build timelines and/or request parameters. For most part, PleromaFE tries to store all the info it can get in global vuex store - every user and post are passed trough updating mechanism where data is either added or merged with existing data, reactively updating the information throughout UI, so if in newest request user's post counter increased, it will be instantly updated in open user profile cards. This is also used to find users, posts and sometimes to build timelines and/or request parameters.

View file

@ -1,207 +0,0 @@
# Pleroma-FE user guide
> Be prepared for breaking changes, unexpected behavior and this user guide becoming obsolete and wrong.
> If there was no insanity
>
> it would be necessary to create it.
>
> --Catbag
## Posting, reading, basic functions.
After registering and logging in you're presented with your timeline in right column and new post form with timeline list and notifications in the left column.
Posts will contain the text you are posting, but some content will be modified:
1. Mentions: Mentions have the form of @user or @user<span></span>@instance.tld. These will become links to the user's profile. In addition, the mentioned user will always get a notification about the post they have been mentioned in, so only mention users that you want to receive this message.
2. URLs: URLs like `http://example.com` will be automatically be turned into a clickable links.
3. Hashtags: Hashtags like #cofe will also be turned into links.
**Depending on your instance some of the options might not be available or have different defaults**
Let's clear up some basic stuff. When you post something it's called a **post** or it could be called a **status** or even a **toot** or a **prööt** depending on whom you ask. Post has body/content but it also has some other stuff in it - from attachments, visibility scope, subject line.
* **Emoji** are small images embedded in text, there are two major types of emoji: [unicode emoji](https://en.wikipedia.org/wiki/Emoji) and custom emoji. While unicode emoji are universal and standardized, they can appear differently depending on where you are using them or may not appear at all on older systems. Custom emoji are more *fun* kind - instance administrator can define many images as *custom emoji* for their users. This works very simple - custom emoji is defined by its *shortcode* and an image, so that any shortcode enclosed in colons get replaced with image if such shortcode exist.
Let's say there's `:pleroma:` emoji defined on instance. That means
> First time using :pleroma: pleroma!
will become
> First time using ![pleroma](./example_emoji.png) pleroma!
Note that you can only use emoji defined on your instance, you cannot "copy" someone else's emoji, and will have to ask your administrator to copy emoji from other instance to yours.
Lastly, there's two convenience options for emoji: an emoji picker (smiley face to the right of "submit" button) and autocomplete suggestions - when you start typing :shortcode: it will automatically try to suggest you emoj and complete the shortcode for you if you select one. **Note** that if emoji doesn't show up in suggestions nor in emoji picker it means there's no such emoji on your instance, if shortcode doesn't match any defined emoji it will appear as text.
* **Attachments** are fairly simple - you can attach any file to a post as long as the file is within maximum size limits. If you're uploading explicit material you can mark all of your attachments as sensitive (or add `#nsfw` tag) - it will hide the images and videos behind a warning so that it won't be displayed instantly.
* **Subject line** also known as **CW** (Content Warning) could be used as a header to the post and/or to warn others about contents of the post having something that might upset somebody or something among those lines. Several applications allow to hide post content leaving only subject line visible. Using a subject line will not mark your images as sensitive, you will have to do that explicitly (see above).
* **Visiblity scope** controls who will be able to see your posts. There are four scopes available:
1. `Public`: This is the default, and some fediverse software like GNU Social only supports this. This means that your post is accessible by anyone and will be shown in the public timelines.
2. `Unlisted`: This is the same as public, but your post won't appear in the public timelines. The post will still be accessible by anyone who comes across it (for example, by looking at your profile) or by direct linking. They will also appear in public searches.
3. `Followers only`: This will show your post only to your followers. Only they will be able to interact with it. Be careful: When somebody follows you, they will be able to see all your previous `followers only` posts as well! If you want to restrict who can follow you, consider [locking your account down to only approved followers](#profle).
4. `Direct`: This will only send the message to the people explicitly mentioned in the post.
A few things to consider about the security and usage of these scopes:
- None of these options will change the fact that the messages are all saved in the database unencrypted. They will be visible to your server admin and to any other admin of a server who receives this post. Do not share information that you would consider secret or dangerous. Use encrypted messaging systems for these things.
- Follower-only posts can lead to fragmented conversations. If you post a follower-only post and somebody else replies to it with a follower-only post, only people following both of you will see the whole conversation thread. Everybody else will only see half of it. Keep this in mind and keep conversations public if possible.
- Changing scopes during a thread or adding people to a direct message will not retroactively make them see the whole conversation. If you add someone to a direct message conversation, they will not see the post that happened before they were mentioned.
* **Reply-to** if you are replying to someone, your post will also contain a note that your post is referring to the post you're replying to. Person you're replying to will receive a notification *even* if you remove them from mentioned people. You won't receive notifications when replying to your own posts, but it's useful to reply to your own posts to provide people some context if it's a follow-up to a previous post. There's a small "Reply to ..." label under post author's name which you can hover on to see what post it's referring to.
Sometimes you may encounter posts that seem different than what they are supposed to. For example, you might see a direct message without any mentions in the text. This can happen because internally, the Fediverse has a different addressing mechanism similar to email, with `to` and `cc` fields. While these are not directly accessible in PleromaFE, other software in the Fediverse might generate those posts. Do not worry in these cases, these are normal and not a bug.
#### Rich text
By default new posts you make are plaintext, meaning you can't make text **bold** or add custom links or make lists or anything like that. However if your instance allows it you can use Markdown or BBCode or HTML to spice up your text, however there are certain limitations to what HTML tags and what features of Markdown you can use.
this section will be expanded later
### Other actions
In addition to posting you can also *favorite* post also known as *liking* them and *repeat* posts (also known as *retweeting*, *boosting* and even *reprööting*). Favoriting a post increments a counter on it, notifies post author of your affection towards that post and also adds that post to your "favorited" posts list (in your own profile, "Favorites" tab). Reprööting a post does all that and also repeats this post to your followers and your profile page with a note "*user* repeated post".
Your own posts can be deleted, but this will only reliably delete the post from your own instance. Other instances will receive a deletion notice, but there's no way to force them to actually delete a post. In addition, not all instances that contain the message might even receive the deletion notice, because they might be offline or not known to have the post because they received it through a repeat. Lastly, deletion notice might not reach certain frontends and clients - post will be visible for them until page refresh or cache clear, they probably won't be able to interact with it apart from replying to it (which will have reply-to mark missing).
If you are a moderator, you can also delete posts by other people. If those people are on your instance, it will delete the post and send out the deletion notice to other servers. If they are not on your instance, it will just remove the post from your local instance.
There's also an option to report a user via a post (if the feature is available on your instance) which could be used to notify your (and probably other instance's) admin that someone is being naughty.
## Users
When you see someone, you can click on their user picture to view their profile, and click on the userpic in that to see *full* profile. You can *follow* them, *mute* and *block* them. Following is self-explanatory, it adds them t your Home Timeline, lists you as a follower and gives you access to follower-only posts if they have any. Muting makes posts and notifications made by them very tiny, giving you an option to see the post if you're curious. However on clients other than PleromaFE their posts will be completely removed. *Blocking* a user removes them from your timeline and notifications and prevents them from following you (automatically unfollows them from you).
Please note that some users can be "locked", meaning instead of following them you send a follow request they need to approve for you to become their follower.
## Timelines
Currently you have several timelines to browse trough:
* **Timeline** aka Home Timeline - this timeline contains all posts by people you follow and your own posts, as well as posts mentioning you directly.
* **Interactions** all interactions you've had with people on the network, basically same as notifications except grouped in convenient way - mentions separate from favorites with repeats separate from follows
* **Direct Messages** all posts with `direct` scope addressed to you or mentioning you.
* **Public Timelines** all posts made by users on instance you're on
* **The Whole Known Network** also known as **TWKN** or **Federated Timeline** - all posts on the network by everyone, almost. Due to nature of the network your instance may not know *all** the instances on the network, so only posts originating from known instances are shown there.
## Your profile
By clicking wrench icon above the post form you can access the profile edit or "user settings" screen.
### Profle
Here you can set up how you appear to other users among with some other settings:
- Name: this is text that displays next to your avatar in posts. Please note that you **cannot** change your *@<span></span>handle*
- Bio: this will be displayed under your profile - you can put anything you want there you want for everyone to see.
- Restrict your account to approved followers only: this makes your account "locked", when people follow you - you have to approve or deny their follow requests, this gives more control over who sees your followers only posts.
- Default visibility scope: this chooses your default post scope for new posts
- Strip rich text from all posts: this strips rich text formatting (bold/italics/lists etc) from all incoming posts. Will only affect newly fetched posts.
If you're admin or moderator on your instance you also get "Show [role] badge in my profile" - this controls whether to show "Admin" or "Moderator** label on your profile page.
**For all options mentioned above you have to click "Submit" button for changes to take place**
- Avatar: this changes picture next to your posts. Your avatar shouldn't exceed 2 MiB (2097152 bytes) or it could cause problems with certain instances.
- Banner: this changes background on your profile card. Same as avatar it shouldn't exceed 2 MiB limit.
- Profile Background: this changes background picture for UI. It isn't shown to anyone else **yet**, but some time later it will be shown when viewing your profile.
### Security
Here you can change your password, revoke access tokens, configure 2-factor authentication (if available).
### Notifications
This screen allows more fine-grained control over what notifications to show to you based on whom it comes from
### Data Import/Export
This allows you to export and import a list of people you follow, in case instance's database gets reverted or if you want to move to another server. Note that you **CANNOT export/import list of people who *follow you***, they'll just need to follow you back after you move.
### Blocks and Mutes
These screens give access to full list of people you block/mute, useful for *un*blocking/*un*muting people because blocking/muting them most likely removes them out of your sight completely.
## Other stuff
By default you can see **ALL** posts made by other users on your Home Timeline, this contrast behavior of Twitter and Mastodon, which shows you only non-reply posts and replies to people you follow. You can set it up to replicate the said behavior, however the option is currently broken.
You can view other people's profiles and search for users (top-right corner, person with a plus icon). Tag search is possible but not implemented properly yet, right now you can click on tag link in a post to see posts tagged with that post.
You can also view posts you've favorited on your own profile, but you cannot see favorites by other people.
Due to nature of how Pleroma (backend) operates you might see old posts appear as if they are new, this is because instance just learned about that post (i.e. your instance is younger that some other ones) and someone interacted with old post. Posts are sorted by date of when they are received, not date they have been posted because it's very easy to spoof the date, so a post claiming it "was" made in year 2077 could hand at top of your TL forever.
# Customization and configuration
Clicking on the cog icon in the upper right will go to the settings screen.
## General
### Interface
- Language: Here you can set the interface language. The default language is the one that you set in your browser settings.
- Hide instance-specific panel: This hides the panel in the lower left that usually contains general information about the server.
### Timeline
- Hide posts of muted users: If this is set, 'muting' a user will completely hide their posts instead of collapsing them.
- Collapse posts with subjects: This will collapse posts that contain a subject, hiding their content. Subjects are also sometimes called content warnings.
- Enable automatic streaming of new posts when scrolled to the top: With this enabled, new posts will automatically stream in when you are scrolled to the top. Otherwise, you will see a button on the timeline that will let you display the new posts.
- Pause streaming when tab is not focused: This pauses the automatic streaming that the previous option enables when the tab is out of focus. This is useful if you don't want to miss any new posts.
- Enable automatic loading when scrolled to the bottom: When this is disabled, a button will be shown on the bottom of the timeline that will let you load older posts.
- Enable reply-link preview on hover: Status posts in the timeline and notifications contain links to replies and to the post they are a reply to. If this setting is enabled, hovering over that link will display that linked post in a small hovering overlay.
### Composing
- Copy scope when replying: When this is activated, the scope of a reply will be the same as the scope of the post it is replying to. This is useful to prevent accidentally moving private discussions to public, or vice versa.
- Always show subject field: Whether or not to display the 'subject' input field in the post form. If you do not want to use subjects, you can deactivate this.
- Copy subject when replying: This controls if the subject of a post will be copied from the post it is replying to.
- Post status content type: Selects the default content type of your post. The options are: Plain text, HTML, BBCode and Markdown.
- Minimize scope selection options: Selecting this will reduce the visibility scopes to 'direct', your default post scope and post scope of post you're replying to.
- Automatically hide New Post button: Mobile interface only: hide floating "New post" button when scrolling
### Attachments
- Hide attachments in timeline: Do not display attachments in timelines. They will still display in expanded conversations. This is useful to save bandwidth and for browsing in public.
- Hide attachments in conversations: Also hide attachments in expanded conversations.
- Maximum amount of thumbnails per post: Exactly that :)
- Enable clickthrough NSFW attachment hiding: Hide attachments that are marked as NSFW/sensitive behind a click-through image.`
- Preload images: This will preload the hidden images so that they display faster when clicking through.
- Open NSFW attachments with just one click: Directly open NSFW attachments in a maximised state instead of revealing the image thumbnail.
- Play-on-hover GIFs: With this activated, GIFs images and avatars will only be animated on mouse hover. Otherwise, they will be always animated. This is very useful if your timeline looks too flashy from people's animated avatars and eases the CPU load.
- Loop videos: Whether to loop videos indefinitely.
- Loop only videos without sound: Some instances will use videos without sounds instead of GIFs. This will make only those videos autoplay.
- Play videos directly in the media viewer: Play videos right in the timeline instead of opening it in a modal
- Don't crop the attachment in thumbnails: if enabled, images in attachments will be fit entirely inside the container instead of being zoomed in and cropped.
### Notifications
- Enable web push notifications: this enables Web Push notifications, to allow receiving notifications even when the page isn't opened, doesn't affect regular notifications.
## Theme
You can change the look and feel of Pleroma Frontend here. You can choose from several instance-provided presets and you can load one from file and save current theme to file. Before you apply new theme you can see what it will look like approximately in preview section.
Themes engine was made to be easy to use while giving an option for powerful in-depth customization - you can just tweak colors on "Common" tab and leave everything else as is.
If there's a little check box next to a color picker it means that color is optional and unless checked will be automatically picked based on some other color or defaults.
For some features you can also adjust transparency of it by changing its opacity, you just need to tick checkbox next to it, otherwise it will be using default opacity.
Contrast information is also provided - you can see how readable text is based on contrast between text color and background, icons under color pickers represent contrast rating based on [WCAG](https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast) - thumbs up means AAA rating (good), half-filled circle means AA rating (acceptable) and warning icon means it doesn't pass the minimal contrast requirement and probably will be less readable, especially for vision-challenged people, you can hover over icon to see more detailed information. *Please note* that if background is not opaque (opacity != 1) contrast will be measured based on "worst case scenario", i.e. behind semi-transparent background lies some solid color that makes text harder to read, this however is still inaccurate because it doesn't account that background can be noisy/busy, making text even harder to read.
Apart from colors you can also tweak shadow and lighting, which is used mostly to give buttons proper relief based on their state, give panes their shade, make things glow etc. It's quite powerful, and basically provides somewhat convenient interface for [CSS Shadows](https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow).
Another thing you can tweak is theme's roundness - some people like sharp edges, some want things more rounded. This is also used if you want circled or square avatars.
Lastly, you can redefine fonts used in UI without changing fonts in your browser or system, this however requires you to enter font's full name and having that font installed on your system.
## Filtering
- Types of notifications to show: This controls what kind of notifications will appear in notification column and which notifications to get in your system outside the web page
- Replies in timeline: You may know that other social networks like Twitter will often not display replies to other people in your timeline, even if you are following the poster. Pleroma usually will show these posts to you to encourage conversation. If you do not like this behavior, you can change it here.
- Hide post statistics: This hides the number of favorites, number of replies, etc.
- Hide user statistics: This hides the number of followers, friends, etc.
- Muted words: A list of words that will be muted (i.e. displayed in a collapsed state) on the timeline and in notifications. An easy way to tune down noise in your timeline. Posts can always be expanded when you actually want to see them.
- Hide filtered statuses: Selecting this will hide the filtered / muted posts completely instead of collapsing them.
## Version
Just displays the backend and frontend version. Useful to mention in bug reports.

View file

Before

Width:  |  Height:  |  Size: 491 B

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -5,4 +5,4 @@ Pleroma-FE is the default user-facing frontend for Pleroma. It's user interface
## How can I use it? ## How can I use it?
If your instance uses Pleroma-FE, you can acces it by going to your instance (e.g. <https://pleroma.soykaf.com>). You can read more about it's basic functionality in the [Pleroma-FE User Guide](./USER_GUIDE.md). We also have [a guide for administrators](./CONFIGURATION.md) and for [hackers/contributors](./HACKING.md). If your instance uses Pleroma-FE, you can acces it by going to your instance (e.g. <https://pleroma.soykaf.com>). You can read more about it's basic functionality in the [Pleroma-FE User Guide](./user_guide/). We also have [a guide for administrators](./CONFIGURATION.md) and for [hackers/contributors](./HACKING.md).

44
docs/user_guide/index.md Normal file
View file

@ -0,0 +1,44 @@
# General overview
> Be prepared for breaking changes, unexpected behavior and this user guide becoming obsolete and wrong.
> If there was no insanity
>
> it would be necessary to create it.
>
> --Catbag
Pleroma-FE is the default user-facing frontend for Pleroma. If your instance uses Pleroma-FE, you can access it by going to your instance (e.g. <https://pleroma.soykaf.com>). After logging in you will have two columns in front of you. Here we're going to keep it to the default behaviour, but some instances swap the left and right columns. If you're on such an instance what we refer to as the left column will be on your right and vice versa.
### Left column
- first block: This section is dedicated to [posting](posting_reading_basic_functions.md)
- second block: Here you can switch between the different views for the right column.
- Optional third block: This is the Instance panel that can be activated, but is deactivated by default. It's fully customisable by instance admins and by default has links to the Pleroma-FE and Mastodon-FE.
- fourth block: This is the Notifications block, here you will get notified whenever somebody mentions you, follows you, repeats or favorites one of your statuses
### Right column
This is where the interesting stuff happens! There are different views depending on what you choose in the second block of the left panel.
- **Timelines** Depending on the [timeline](timelines.md) you will see different statuses, but each status has a standard structure:
- Profile pic, name and link to profile. An optional left-arrow if it's a reply to another status (hovering will reveal the reply-to status). Clicking on the profile pic will uncollapse the user's profile where you can find information about the account and can [follow, mute or block the account](users_follow_mute_block.md).
- An arrow icon on the right side allows you to open the status on the instance where it's originating from.
- A `+` button on the rightmost side allows you to Expand/Collapse an entire discussion thread.
- The text of the status, including mentions and attachments. If you click on a mention, it will automatically open the profile page of that person.
- Four buttons (left to right): Reply, Repeat, Favorite and Add Reaction. The three dots next to it are a dropdown menu for extra options including simple moderation, bookmarking, deleting posts, pinning your own posts to your profile and more.
- **Interactions** shows all interactions you've had with people on the network, basically same as notifications except grouped in convenient way.
- **Chats** is the chat feature. You can find your friends and start chatting with them. At the moment chat are only one-on-one, but once groups are introduced groupchats will also be possible.
- **About** is the about-page and lists the staff, the TOS, activated MRF's, and enabled features
### Top right
- The magnifier icon opens the search screen
- You can search for statuses, people and hashtags.
- You can import statuses from remote servers by pasting the url to the post in the search field.
- If you want to search for users that your instance doesn't know about yet, you can search for them using the full `name@instance.tld` handle. You can also use the full url from their remote profile.
- The gear icon gives you [settings](settings.md)
- If you have admin rights, you'll see an icon that opens the admin interface
- The last icon is to log out
### Bottom right
On the bottom right you have the Shoutbox. Here you can communicate with people on the same instance in realtime. It is local-only, very basic and will most probably be removed once the Chats functionality allows group chats.

View file

@ -0,0 +1,76 @@
# Posting, reading, basic functions.
!!! warning
Depending on your instance some of the options might not be available or have different defaults
After registering and logging in you're presented with your timeline in right column and new post form with timeline list and notifications in the left column.
Posts will contain the text you are posting, but some content will be modified:
1. Mentions: Mentions have the form of @user or @user<span></span>@instance.tld. These will become links to the user's profile. In addition, the mentioned user will always get a notification about the post they have been mentioned in, so only mention users that you want to receive this message.
2. URLs: URLs like `http://example.com` will be automatically be turned into a clickable links.
3. Hashtags: Hashtags like #cofe will also be turned into links.
4. There is a default character limit of 5000 characters.
Let's clear up some basic stuff. When you post something it's called a **post** or it could be called a **status** or even a **toot** or a **prööt** depending on whom you ask. Post has body/content but it also has some other stuff in it - from attachments, visibility scope, subject line...
**Emoji** are small images embedded in text, there are two major types of emoji: [unicode emoji](https://en.wikipedia.org/wiki/Emoji) and custom emoji. While unicode emoji are universal and standardized, they can appear differently depending on where you are using them or may not appear at all on older systems. Custom emoji are a more *fun* kind - instance administrator can define many images as *custom emoji* for their users. This works very simple - custom emoji is defined by its *shortcode* and an image, so that any shortcode enclosed in colons get replaced with image if such shortcode exist.
Let's say there's a `:pleroma:` emoji defined on an instance. That means
> First time using :pleroma: pleroma!
will become
> First time using ![pleroma](../assets/example_emoji.png) pleroma!
Note that you can only use emoji defined on your instance, you cannot "copy" someone else's emoji, and will have to ask your administrator to copy emoji from other instance to yours.
Lastly, there's two convenience options for emoji: an emoji picker (smiley face to the right of "submit" button) and autocomplete suggestions - when you start typing :shortcode: it will automatically try to suggest you emoji and complete the shortcode for you if you select one. If emoji doesn't show up in suggestions nor in emoji picker it means there's no such emoji on your instance, if shortcode doesn't match any defined emoji it will appear as text.
**Attachments** are fairly simple - you can attach any file to a post as long as the file is within maximum size limits. If you're uploading explicit material you can mark all of your attachments as sensitive (or add the `#nsfw` tag) - it will hide the images and videos behind a warning so that it won't be displayed instantly.
**Subject line** also known as **CW** (Content Warning) could be used as a header to the post and/or to warn others about contents of the post having something that might upset somebody or something among those lines. Several applications allow to hide post content leaving only subject line visible. Using a subject line will not mark your images as sensitive, you will have to do that explicitly (see above).
**Visiblity scope** controls who will be able to see your posts. There are four scopes available:
1. `Public`: This is the default, and some fediverse software, like GNU Social, only supports this. This means that your post is accessible by anyone and will be shown in the public timelines.
2. `Unlisted`: This is the same as public, but your post won't appear in the public timelines. The post will still be accessible by anyone who comes across it (for example, by looking at your profile) or by direct linking. They will also appear in public searches.
3. `Followers only`: This will show your post only to your followers. Only they will be able to interact with it. Be careful: When somebody follows you, they will be able to see all your previous `followers only` posts as well! If you want to restrict who can follow you, consider [locking your account down to only approved followers](../settings#profile).
4. `Direct`: This will only send the message to the people explicitly mentioned in the post.
A few things to consider about the security and usage of these scopes:
- None of these options will change the fact that the messages are all saved in the database unencrypted. They will be visible to your server admin and to any other admin of a server who receives this post. Do not share information that you would consider secret or dangerous. Use encrypted messaging systems for these things.
- Follower-only posts can lead to fragmented conversations. If you post a follower-only post and somebody else replies to it with a follower-only post, only people following both of you will see the whole conversation thread. Everybody else will only see half of it. Keep this in mind and keep conversations public if possible.
- Changing scopes during a thread or adding people to a direct message will not retroactively make them see the whole conversation. If you add someone to a direct message conversation, they will not see the post that happened before they were mentioned.
* **Reply-to** if you are replying to someone, your post will also contain a note that your post is referring to the post you're replying to. Person you're replying to will receive a notification *even* if you remove them from mentioned people. You won't receive notifications when replying to your own posts, but it's useful to reply to your own posts to provide people some context if it's a follow-up to a previous post. There's a small "Reply to ..." label under post author's name which you can hover on to see what post it's referring to.
Sometimes you may encounter posts that seem different than what they are supposed to. For example, you might see a direct message without any mentions in the text. This can happen because internally, the Fediverse has a different addressing mechanism similar to email, with `to` and `cc` fields. While these are not directly accessible in PleromaFE, other software in the Fediverse might generate those posts. Do not worry in these cases, these are normal and not a bug.
## Rich text
By default new posts you make are plaintext, meaning you can't make text **bold** or add custom links or make lists or anything like that. However if your instance allows it you can use Markdown or BBCode or HTML to spice up your text, however there are certain limitations to what HTML tags and what features of Markdown you can use.
Here is a small example of some text in markdown.
```
This is an example of markdown text using **bold** and *cursive* text.
To get a newline we add two spaces at the end of the previous line.
Let's also add a list
* with
* some
* items
```
If you set the input-method to Markdown, and post this, it will look something like
![example_markdown](../assets/example_markdown.png)
## Other actions
In addition to posting you can also *favorite* posts also known as *liking* them and *repeat* posts (also known as *retweeting*, *boosting* and even *reprööting*). Favoriting a post increments a counter on it, notifies the post author of your affection towards that post and also adds that post to your "favorited" posts list (in your own profile, "Favorites" tab). Reprööting a post does all that and also repeats this post to your followers and your profile page with a note "*user* repeated post".
Your own posts can be deleted, but this will only reliably delete the post from your own instance. Other instances will receive a deletion notice, but there's no way to force them to actually delete a post. In addition, not all instances that contain the message might even receive the deletion notice, because they might be offline or not known to have the post because they received it through a repeat. Lastly, deletion notice might not reach certain frontends and clients - post will be visible for them until page refresh or cache clear, they probably won't be able to interact with it apart from replying to it (which will have reply-to mark missing).
If you are a moderator, you can also delete posts by other people. If those people are on your instance, it will delete the post and send out the deletion notice to other servers. If they are not on your instance, it will just remove the post from your local instance.
There's also an option to report a user's post which can be used to notify your (and optionally the other instance's) admin that someone is being naughty.

116
docs/user_guide/settings.md Normal file
View file

@ -0,0 +1,116 @@
# Settings
On the top-right you will see a gear icon. Click it to open the settings.
## General
### Interface
- **Interface language** is where you can set the interface language. The default language is the one that you set in your browser settings.
- **Hide instance-specific panel** hides the panel in the lower left that usually contains general information about the server. This will only be visible if your admin has activated this panel and is deactivated by default.
### Timeline
- **Hide posts of muted users** If this is set, 'muting' a user will completely hide their posts instead of collapsing them.
- **Collapse posts with subjects** This will collapse posts that contain a subject, hiding their content. Subjects are also sometimes called content warnings.
- **Enable automatic streaming of new posts when scrolled to the top** With this enabled, new posts will automatically stream in when you are scrolled to the top. Otherwise, you will see a button on the timeline that will let you display the new posts.
- **Pause streaming when tab is not focused** This pauses the automatic streaming that the previous option enables when the tab is out of focus. This is useful if you don't want to miss any new posts.
- **Enable automatic loading when scrolled to the bottom** When this is disabled, a button will be shown on the bottom of the timeline that will let you load older posts.
- **Enable reply-link preview on hover** Status posts in the timeline and notifications contain links to replies and to the post they are a reply to. If this setting is enabled, hovering over that link will display that linked post in a small hovering overlay.
### Composing
- **Copy scope when replying** makes the scope of a reply be the same as the scope of the post it is replying to. This is useful to prevent accidentally moving private discussions to public, or vice versa.
- **Always show subject field** Whether or not to display the 'subject' input field in the post form. If you do not want to use subjects, you can deactivate this.
- **Copy subject when replying** controls if the subject of a post will be copied from the post it is replying to.
- **Post status content type** selects the default content type of your post. The options are: Plain text, HTML, BBCode and Markdown.
- **Minimize scope selection options** will reduce the visibility scopes to 'direct', your default post scope and post scope of post you're replying to.
- **Automatically hide New Post button** hides the floating "New post" button when scrolling on mobile view.
- **Pad emoji with spaces when adding from picker** Will add spaces around emoji you select it from the picker.
### Attachments
- **Hide attachments in timeline** Do not display attachments in timelines. They will still display in expanded conversations. This is useful to save bandwidth and for browsing in public.
- **Hide attachments in conversations** Also hide attachments in expanded conversations.
- **Maximum amount of thumbnails per post** Exactly that :)
- **Enable clickthrough NSFW attachment hiding** Hide attachments that are marked as NSFW/sensitive behind a click-through image.`
- **Preload images** This will preload the hidden images so that they display faster when clicking through.
- **Open NSFW attachments with just one click** Directly open NSFW attachments in a maximised state instead of revealing the image thumbnail.
- **Play-on-hover GIFs** With this activated, GIFs images and avatars will only be animated on mouse hover. Otherwise, they will be always animated. This is very useful if your timeline looks too flashy from people's animated avatars and eases the CPU load.
- **Loop videos** Whether to loop videos indefinitely.
- **Loop only videos without sound** Some instances will use videos without sounds instead of GIFs. This will make only those videos autoplay.
- **Play videos directly in the media viewer** Play videos right in the timeline instead of opening it in a modal
- **Don't crop the attachment in thumbnails** if enabled, images in attachments will be fit entirely inside the container instead of being zoomed in and cropped.
### Notifications
- **Enable web push notifications** this enables Web Push notifications, to allow receiving notifications even when the page isn't opened, doesn't affect regular notifications.
### Fun
- **Meme arrows** will make `> greentext` be shown in green (using the "green" from the theme that is used).
## Profile
Here you can set up how you appear to other users among with some other settings:
- **Name** is text that displays next to your avatar in posts. Please note that you **cannot** change your *@handle*
- **Bio** will be displayed under your profile - you can put anything you want there you want for everyone to see.
- **Restrict your account to approved followers only** makes your account "locked", when people follow you - you have to approve or deny their follow requests, this gives more control over who sees your followers only posts.
- **Default visibility scope** is your default post scope for new posts
- **Strip rich text from all posts** strips rich text formatting (bold/italics/lists etc) from all incoming posts. This will only affect newly fetched posts.
If you're admin or moderator on your instance you also get **Show [role] badge in my profile** - this controls whether to show "Admin" or "Moderator** label on your profile page.
**For all options mentioned above you have to click "Submit" button for changes to take place**
- **Avatar** this changes picture next to your posts. Your avatar shouldn't exceed 2 MiB (2097152 bytes) or it could cause problems with certain instances.
- **Banner** this changes background on your profile card. Same as avatar it shouldn't exceed 2 MiB limit.
- **Profile Background** this changes background picture for UI. It isn't shown to anyone else *yet*, but some time later it will be shown when viewing your profisle.
## Security
Here you can change your password, revoke access tokens, configure 2-factor authentication (if available).
## Filtering
- **Types of notifications to show** This controls what kind of notifications will appear in notification column and which notifications to get in your system outside the web page
- **Replies in timeline** You may know that other social networks like Twitter will often not display replies to other people in your timeline, even if you are following the poster. Pleroma usually will show these posts to you to encourage conversation. If you do not like this behavior, you can change it here.
- **Hide post statistics** This hides the number of favorites, number of replies, etc.
- **Hide user statistics** This hides the number of followers, friends, etc.
- **Muted words** allows a list of words that will be muted (i.e. displayed in a collapsed state) on the timeline and in notifications. An easy way to tune down noise in your timeline. By default posts can be expanded if you want to see them.
- **Hide filtered statuses** will hide the filtered / muted posts completely instead of collapsing them.
## Theme
Here you can change the look and feel of Pleroma-FE. You can choose from several instance-provided presets and you can load one from file and save current theme to file. Before you apply new theme you can see what it will look like approximately in preview section.
The themes engine was made to be easy to use while giving an option for powerful in-depth customization - you can just tweak colors on "Common" tab and leave everything else as is.
If there's a little check box next to a color picker it means that color is optional and unless checked will be automatically picked based on some other color or defaults.
For some features you can also adjust transparency of it by changing its opacity, you just need to tick checkbox next to it, otherwise it will be using default opacity.
Contrast information is also provided - you can see how readable text is based on contrast between text color and background, icons under color pickers represent contrast rating based on [WCAG](https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast) - thumbs up means AAA rating (good), half-filled circle means AA rating (acceptable) and warning icon means it doesn't pass the minimal contrast requirement and probably will be less readable, especially for vision-challenged people, you can hover over icon to see more detailed information. *Please note* that if background is not opaque (opacity != 1) contrast will be measured based on "worst case scenario", i.e. behind semi-transparent background lies some solid color that makes text harder to read, this however is still inaccurate because it doesn't account that background can be noisy/busy, making text even harder to read.
Apart from colors you can also tweak shadow and lighting, which is used mostly to give buttons proper relief based on their state, give panes their shade, make things glow etc. It's quite powerful, and basically provides somewhat convenient interface for [CSS Shadows](https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow).
Another thing you can tweak is theme's roundness - some people like sharp edges, some want things more rounded. This is also used if you want circled or square avatars.
Lastly, you can redefine fonts used in UI without changing fonts in your browser or system, this however requires you to enter font's full name and having that font installed on your system.
## Notifications
This screen allows more fine-grained control over what notifications to show to you based on whom it comes from.
## Data Import/Export
This allows you to export and import a list of people you follow and block, in case instance's database gets reverted or if you want to move to another server. Note that you **CANNOT export/import list of people who *follow you***, they'll need to follow you back themselves.
## Mutes and Blocks
These screens give access to full list of people you block/mute, useful for *un*blocking/*un*muting people because blocking/muting them most likely removes them out of your sight completely.
## Version
Just displays the backend and frontend version. Useful to mention in bug reports.

View file

@ -0,0 +1,13 @@
# Timelines
You have several timelines to browse trough
- **Timeline** aka Home Timeline - this timeline contains all posts by people you follow and your own posts, as well as posts mentioning you directly.
- **Bookmarks** all the posts you've bookmarked. You can bookmark a post by clicking the three dots on the bottom right of the post and choose Bookmark.
- **Direct Messages** all posts with `direct` scope addressed to you or mentioning you.
- **Public Timelines** all public posts made by users on the instance you're on
- **The Whole Known Network** also known as **TWKN** or **Federated Timeline** - all public posts known by your instance. Due to nature of the network your instance may not know *all* the posts on the network, so only posts known by your instance are shown there.
Note that by default you will see all posts made by other users on your Home Timeline, this contrast behavior of Twitter and Mastodon, which shows you only non-reply posts and replies to people you follow. You can change said behavior in the [settings](settings.md#filtering).
By default instances will try to send activities (e.g. posts, favorites, etc.) up to 7 days or until the target server received them. For this reason posts that are up to 7 days old and your server didn't know about yet can pop up on your timeline. This is the default behaviour and can be changed by your admin.

View file

@ -0,0 +1,11 @@
# Users: follow, mute, block
When you see someone, you can click on their user picture to view their profile, and click on the userpic in that to see *full* profile. You can **follow** them, **mute** and **block** them.
**Following** is self-explanatory, it adds them to your Home Timeline, lists you as a follower and gives you access to follower-only posts if they have any.
**Muting** collapses posts and notifications made by them, giving you an option to see the post if you're curious. Clients other than PleromaFE may completely remove their posts.
**Blocking** a user removes them from your timeline and notifications and prevents them from following you (automatically unfollows them from you).
Please note that some users can be "locked", meaning instead of following them you send a follow request they need to approve for you to become their follower.

View file

@ -3,7 +3,6 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
<title>Pleroma</title>
<!--server-generated-meta--> <!--server-generated-meta-->
<link rel="icon" type="image/png" href="/favicon.png"> <link rel="icon" type="image/png" href="/favicon.png">
</head> </head>

View file

@ -16,102 +16,111 @@
"lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs" "lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.7.6", "@babel/runtime": "7.17.8",
"@chenfengyuan/vue-qrcode": "^1.0.0", "@chenfengyuan/vue-qrcode": "2.0.0",
"body-scroll-lock": "^2.6.4", "@fortawesome/fontawesome-svg-core": "1.3.0",
"chromatism": "^3.0.0", "@fortawesome/free-regular-svg-icons": "5.15.4",
"cropperjs": "^1.4.3", "@fortawesome/free-solid-svg-icons": "5.15.4",
"diff": "^3.0.1", "@fortawesome/vue-fontawesome": "3.0.0-5",
"escape-html": "^1.0.3", "@kazvmoe-infra/pinch-zoom-element": "1.2.0",
"localforage": "^1.5.0", "@vuelidate/core": "2.0.0-alpha.35",
"parse-link-header": "^1.0.1", "@vuelidate/validators": "2.0.0-alpha.27",
"phoenix": "^1.3.0", "body-scroll-lock": "2.7.1",
"portal-vue": "^2.1.4", "chromatism": "3.0.0",
"v-click-outside": "^2.1.1", "click-outside-vue3": "4.0.1",
"vue": "^2.6.11", "cropperjs": "1.5.12",
"vue-chat-scroll": "^1.2.1", "diff": "3.5.0",
"vue-i18n": "^7.3.2", "escape-html": "1.0.3",
"vue-router": "^3.0.1", "localforage": "1.10.0",
"vue-template-compiler": "^2.6.11", "parse-link-header": "1.0.1",
"vuelidate": "^0.7.4", "phoenix": "1.6.2",
"vuex": "^3.0.1" "punycode.js": "2.1.0",
"qrcode": "1",
"ruffle-mirror": "2021.12.31",
"vue": "^3.2.31",
"vue-i18n": "^9.2.0-beta.34",
"vue-router": "4.0.14",
"vue-template-compiler": "2.6.11",
"vuex": "4.0.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.7.5", "@babel/core": "7.17.8",
"@babel/plugin-transform-runtime": "^7.7.6", "@babel/plugin-transform-runtime": "7.17.0",
"@babel/preset-env": "^7.7.6", "@babel/preset-env": "7.16.11",
"@babel/register": "^7.7.4", "@babel/register": "7.17.7",
"@ungap/event-target": "^0.1.0", "@intlify/vue-i18n-loader": "^5.0.0",
"@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", "@ungap/event-target": "0.2.3",
"@vue/babel-plugin-transform-vue-jsx": "^1.1.2", "@vue/babel-helper-vue-jsx-merge-props": "1.2.1",
"@vue/test-utils": "^1.0.0-beta.26", "@vue/babel-plugin-jsx": "1.1.1",
"autoprefixer": "^6.4.0", "@vue/compiler-sfc": "^3.1.0",
"babel-eslint": "^7.0.0", "@vue/test-utils": "2.0.0-rc.17",
"babel-loader": "^8.0.6", "autoprefixer": "6.7.7",
"babel-plugin-lodash": "^3.3.4", "babel-eslint": "7.2.3",
"chai": "^3.5.0", "babel-loader": "8.2.4",
"chalk": "^1.1.3", "babel-plugin-lodash": "3.3.4",
"chromedriver": "^2.21.2", "chai": "3.5.0",
"connect-history-api-fallback": "^1.1.0", "chalk": "1.1.3",
"cross-spawn": "^4.0.2", "chromedriver": "87.0.7",
"css-loader": "^0.28.0", "connect-history-api-fallback": "1.6.0",
"custom-event-polyfill": "^1.0.7", "copy-webpack-plugin": "6.4.1",
"eslint": "^5.16.0", "cross-spawn": "4.0.2",
"eslint-config-standard": "^12.0.0", "css-loader": "0.28.11",
"eslint-friendly-formatter": "^2.0.5", "custom-event-polyfill": "1.0.7",
"eslint-loader": "^2.1.0", "eslint": "5.16.0",
"eslint-plugin-import": "^2.13.0", "eslint-config-standard": "12.0.0",
"eslint-plugin-node": "^7.0.0", "eslint-friendly-formatter": "2.0.7",
"eslint-plugin-promise": "^4.0.0", "eslint-loader": "2.2.1",
"eslint-plugin-standard": "^4.0.0", "eslint-plugin-import": "2.25.4",
"eslint-plugin-vue": "^5.2.2", "eslint-plugin-node": "7.0.1",
"eventsource-polyfill": "^0.9.6", "eslint-plugin-promise": "4.3.1",
"express": "^4.13.3", "eslint-plugin-standard": "4.1.0",
"file-loader": "^3.0.1", "eslint-plugin-vue": "5.2.3",
"fontello-webpack-plugin": "https://github.com/w3geo/fontello-webpack-plugin.git#6149eac8f2672ab6da089e8802fbfcac98487186", "eventsource-polyfill": "0.9.6",
"function-bind": "^1.0.2", "express": "4.17.3",
"html-webpack-plugin": "^3.0.0", "file-loader": "3.0.1",
"http-proxy-middleware": "^0.17.2", "function-bind": "1.1.1",
"inject-loader": "^2.0.1", "html-webpack-plugin": "3.2.0",
"iso-639-1": "^2.0.3", "http-proxy-middleware": "0.21.0",
"isparta-loader": "^2.0.0", "inject-loader": "2.0.1",
"json-loader": "^0.5.4", "iso-639-1": "2.1.13",
"karma": "^3.0.0", "isparta-loader": "2.0.0",
"karma-coverage": "^1.1.1", "json-loader": "0.5.7",
"karma-firefox-launcher": "^1.1.0", "karma": "6.3.17",
"karma-mocha": "^1.2.0", "karma-coverage": "1.1.2",
"karma-mocha-reporter": "^2.2.1", "karma-firefox-launcher": "1.3.0",
"karma-sinon-chai": "^2.0.2", "karma-mocha": "2.0.1",
"karma-sourcemap-loader": "^0.3.7", "karma-mocha-reporter": "2.2.5",
"karma-spec-reporter": "0.0.26", "karma-sinon-chai": "2.0.2",
"karma-webpack": "^4.0.0-rc.3", "karma-sourcemap-loader": "0.3.8",
"lodash": "^4.16.4", "karma-spec-reporter": "0.0.33",
"lolex": "^1.4.0", "karma-webpack": "4.0.2",
"mini-css-extract-plugin": "^0.5.0", "lodash": "4.17.21",
"mocha": "^3.1.0", "lolex": "1.6.0",
"nightwatch": "^0.9.8", "mini-css-extract-plugin": "0.12.0",
"opn": "^4.0.2", "mocha": "3.5.3",
"ora": "^0.3.0", "nightwatch": "0.9.21",
"postcss-loader": "^3.0.0", "opn": "4.0.2",
"raw-loader": "^0.5.1", "ora": "0.4.1",
"sass": "^1.17.3", "postcss-loader": "3.0.0",
"sass-loader": "git://github.com/webpack-contrib/sass-loader", "raw-loader": "0.5.1",
"sass": "1.20.1",
"sass-loader": "7.2.0",
"selenium-server": "2.53.1", "selenium-server": "2.53.1",
"semver": "^5.3.0", "semver": "5.6.0",
"serviceworker-webpack-plugin": "^1.0.0", "serviceworker-webpack-plugin": "1.0.1",
"shelljs": "^0.7.4", "shelljs": "0.8.5",
"sinon": "^2.1.0", "sinon": "2.4.1",
"sinon-chai": "^2.8.0", "sinon-chai": "2.14.0",
"stylelint": "^13.6.1", "stylelint": "13.6.1",
"stylelint-config-standard": "^20.0.0", "stylelint-config-standard": "20.0.0",
"stylelint-rscss": "^0.4.0", "stylelint-rscss": "0.4.0",
"url-loader": "^1.1.2", "url-loader": "1.1.2",
"vue-loader": "^14.0.0", "vue-loader": "^16.0.0",
"vue-style-loader": "^4.0.0", "vue-style-loader": "4.1.2",
"webpack": "^4.0.0", "webpack": "4.46.0",
"webpack-dev-middleware": "^3.6.0", "webpack-dev-middleware": "3.7.3",
"webpack-hot-middleware": "^2.12.2", "webpack-hot-middleware": "2.24.3",
"webpack-merge": "^0.14.1" "webpack-merge": "0.14.1"
}, },
"engines": { "engines": {
"node": ">= 4.0.0", "node": ">= 4.0.0",

6
renovate.json Normal file
View file

@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
]
}

View file

@ -1,20 +1,21 @@
import UserPanel from './components/user_panel/user_panel.vue' import UserPanel from './components/user_panel/user_panel.vue'
import NavPanel from './components/nav_panel/nav_panel.vue' import NavPanel from './components/nav_panel/nav_panel.vue'
import Notifications from './components/notifications/notifications.vue' import Notifications from './components/notifications/notifications.vue'
import SearchBar from './components/search_bar/search_bar.vue'
import InstanceSpecificPanel from './components/instance_specific_panel/instance_specific_panel.vue' import InstanceSpecificPanel from './components/instance_specific_panel/instance_specific_panel.vue'
import FeaturesPanel from './components/features_panel/features_panel.vue' import FeaturesPanel from './components/features_panel/features_panel.vue'
import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_panel.vue' import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_panel.vue'
import ChatPanel from './components/chat_panel/chat_panel.vue' import ShoutPanel from './components/shout_panel/shout_panel.vue'
import SettingsModal from './components/settings_modal/settings_modal.vue' import SettingsModal from './components/settings_modal/settings_modal.vue'
import MediaModal from './components/media_modal/media_modal.vue' import MediaModal from './components/media_modal/media_modal.vue'
import SideDrawer from './components/side_drawer/side_drawer.vue' import SideDrawer from './components/side_drawer/side_drawer.vue'
import MobilePostStatusButton from './components/mobile_post_status_button/mobile_post_status_button.vue' import MobilePostStatusButton from './components/mobile_post_status_button/mobile_post_status_button.vue'
import MobileNav from './components/mobile_nav/mobile_nav.vue' import MobileNav from './components/mobile_nav/mobile_nav.vue'
import DesktopNav from './components/desktop_nav/desktop_nav.vue'
import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue'
import PostStatusModal from './components/post_status_modal/post_status_modal.vue' import PostStatusModal from './components/post_status_modal/post_status_modal.vue'
import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue' import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue'
import { windowWidth, windowHeight } from './services/window_utils/window_utils' import { windowWidth, windowHeight } from './services/window_utils/window_utils'
import { mapGetters } from 'vuex'
export default { export default {
name: 'app', name: 'app',
@ -22,30 +23,22 @@ export default {
UserPanel, UserPanel,
NavPanel, NavPanel,
Notifications, Notifications,
SearchBar,
InstanceSpecificPanel, InstanceSpecificPanel,
FeaturesPanel, FeaturesPanel,
WhoToFollowPanel, WhoToFollowPanel,
ChatPanel, ShoutPanel,
MediaModal, MediaModal,
SideDrawer, SideDrawer,
MobilePostStatusButton, MobilePostStatusButton,
MobileNav, MobileNav,
DesktopNav,
SettingsModal, SettingsModal,
UserReportingModal, UserReportingModal,
PostStatusModal, PostStatusModal,
GlobalNoticeList GlobalNoticeList
}, },
data: () => ({ data: () => ({
mobileActivePanel: 'timeline', mobileActivePanel: 'timeline'
searchBarHidden: true,
supportsMask: window.CSS && window.CSS.supports && (
window.CSS.supports('mask-size', 'contain') ||
window.CSS.supports('-webkit-mask-size', 'contain') ||
window.CSS.supports('-moz-mask-size', 'contain') ||
window.CSS.supports('-ms-mask-size', 'contain') ||
window.CSS.supports('-o-mask-size', 'contain')
)
}), }),
created () { created () {
// Load the locale from the storage // Load the locale from the storage
@ -53,49 +46,26 @@ export default {
this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val }) this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val })
window.addEventListener('resize', this.updateMobileState) window.addEventListener('resize', this.updateMobileState)
}, },
destroyed () { unmounted () {
window.removeEventListener('resize', this.updateMobileState) window.removeEventListener('resize', this.updateMobileState)
}, },
computed: { computed: {
currentUser () { return this.$store.state.users.currentUser }, currentUser () { return this.$store.state.users.currentUser },
background () { userBackground () { return this.currentUser.background_image },
return this.currentUser.background_image || this.$store.state.instance.background instanceBackground () {
return this.mergedConfig.hideInstanceWallpaper
? null
: this.$store.state.instance.background
}, },
enableMask () { return this.supportsMask && this.$store.state.instance.logoMask }, background () { return this.userBackground || this.instanceBackground },
logoStyle () {
return {
'visibility': this.enableMask ? 'hidden' : 'visible'
}
},
logoMaskStyle () {
return this.enableMask ? {
'mask-image': `url(${this.$store.state.instance.logo})`
} : {
'background-color': this.enableMask ? '' : 'transparent'
}
},
logoBgStyle () {
return Object.assign({
'margin': `${this.$store.state.instance.logoMargin} 0`,
opacity: this.searchBarHidden ? 1 : 0
}, this.enableMask ? {} : {
'background-color': this.enableMask ? '' : 'transparent'
})
},
logo () { return this.$store.state.instance.logo },
bgStyle () { bgStyle () {
return { if (this.background) {
'background-image': `url(${this.background})` return {
'--body-background-image': `url(${this.background})`
}
} }
}, },
bgAppStyle () { shout () { return this.$store.state.shout.joined },
return {
'--body-background-image': `url(${this.background})`
}
},
sitename () { return this.$store.state.instance.name },
chat () { return this.$store.state.chat.channel.state === 'joined' },
hideSitename () { return this.$store.state.instance.hideSitename },
suggestionsEnabled () { return this.$store.state.instance.suggestionsEnabled }, suggestionsEnabled () { return this.$store.state.instance.suggestionsEnabled },
showInstanceSpecificPanel () { showInstanceSpecificPanel () {
return this.$store.state.instance.showInstanceSpecificPanel && return this.$store.state.instance.showInstanceSpecificPanel &&
@ -103,28 +73,22 @@ export default {
this.$store.state.instance.instanceSpecificPanelContent this.$store.state.instance.instanceSpecificPanelContent
}, },
showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel }, showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel },
shoutboxPosition () {
return this.$store.getters.mergedConfig.showNewPostButton || false
},
hideShoutbox () {
return this.$store.getters.mergedConfig.hideShoutbox
},
isMobileLayout () { return this.$store.state.interface.mobileLayout }, isMobileLayout () { return this.$store.state.interface.mobileLayout },
privateMode () { return this.$store.state.instance.private }, privateMode () { return this.$store.state.instance.private },
sidebarAlign () { sidebarAlign () {
return { return {
'order': this.$store.state.instance.sidebarRight ? 99 : 0 'order': this.$store.getters.mergedConfig.sidebarRight ? 99 : 0
} }
} },
...mapGetters(['mergedConfig'])
}, },
methods: { methods: {
scrollToTop () {
window.scrollTo(0, 0)
},
logout () {
this.$router.replace('/main/public')
this.$store.dispatch('logout')
},
onSearchBarToggled (hidden) {
this.searchBarHidden = hidden
},
openSettingsModal () {
this.$store.dispatch('openSettingsModal')
},
updateMobileState () { updateMobileState () {
const mobileLayout = windowWidth() <= 800 const mobileLayout = windowWidth() <= 800
const layoutHeight = windowHeight() const layoutHeight = windowHeight()

View file

@ -14,7 +14,9 @@
right: -20px; right: -20px;
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 50%; background-color: var(--wallpaper);
background-image: var(--body-background-image);
background-position: 50% 50px;
} }
i[class^='icon-'] { i[class^='icon-'] {
@ -33,6 +35,7 @@ h4 {
max-width: 980px; max-width: 980px;
align-content: flex-start; align-content: flex-start;
} }
.underlay { .underlay {
background-color: rgba(0,0,0,0.15); background-color: rgba(0,0,0,0.15);
background-color: var(--underlay, rgba(0,0,0,0.15)); background-color: var(--underlay, rgba(0,0,0,0.15));
@ -69,7 +72,7 @@ a {
color: var(--link, $fallback--link); color: var(--link, $fallback--link);
} }
button { .button-default {
user-select: none; user-select: none;
color: $fallback--text; color: $fallback--text;
color: var(--btnText, $fallback--text); color: var(--btnText, $fallback--text);
@ -85,7 +88,12 @@ button {
font-family: sans-serif; font-family: sans-serif;
font-family: var(--interfaceFont, sans-serif); font-family: var(--interfaceFont, sans-serif);
i[class*=icon-] { &.-sublime {
background: transparent;
}
i[class*=icon-],
.svg-inline--fa {
color: $fallback--text; color: $fallback--text;
color: var(--btnText, $fallback--text); color: var(--btnText, $fallback--text);
} }
@ -106,6 +114,8 @@ button {
color: var(--btnPressedText, $fallback--text); color: var(--btnPressedText, $fallback--text);
background-color: $fallback--fg; background-color: $fallback--fg;
background-color: var(--btnPressed, $fallback--fg); background-color: var(--btnPressed, $fallback--fg);
svg,
i { i {
color: $fallback--text; color: $fallback--text;
color: var(--btnPressedText, $fallback--text); color: var(--btnPressedText, $fallback--text);
@ -118,6 +128,8 @@ button {
color: var(--btnDisabledText, $fallback--text); color: var(--btnDisabledText, $fallback--text);
background-color: $fallback--fg; background-color: $fallback--fg;
background-color: var(--btnDisabled, $fallback--fg); background-color: var(--btnDisabled, $fallback--fg);
svg,
i { i {
color: $fallback--text; color: $fallback--text;
color: var(--btnDisabledText, $fallback--text); color: var(--btnDisabledText, $fallback--text);
@ -131,6 +143,8 @@ button {
background-color: var(--btnToggled, $fallback--fg); background-color: var(--btnToggled, $fallback--fg);
box-shadow: 0px 0px 4px 0px rgba(255, 255, 255, 0.3), 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset; box-shadow: 0px 0px 4px 0px rgba(255, 255, 255, 0.3), 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset;
box-shadow: var(--buttonPressedShadow); box-shadow: var(--buttonPressedShadow);
svg,
i { i {
color: $fallback--text; color: $fallback--text;
color: var(--btnToggledText, $fallback--text); color: var(--btnToggledText, $fallback--text);
@ -146,7 +160,38 @@ button {
} }
} }
input, textarea, .select, .input { .button-unstyled {
background: none;
border: none;
outline: none;
display: inline;
text-align: initial;
font-size: 100%;
font-family: inherit;
padding: 0;
line-height: unset;
cursor: pointer;
box-sizing: content-box;
color: inherit;
&.-link {
color: $fallback--link;
color: var(--link, $fallback--link);
}
&.-fullwidth {
width: 100%;
}
&.-hover-highlight {
&:hover svg {
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
}
}
input, textarea, .input {
&.unstyled { &.unstyled {
border-radius: 0; border-radius: 0;
@ -176,47 +221,11 @@ input, textarea, .select, .input {
hyphens: none; hyphens: none;
padding: 8px .5em; padding: 8px .5em;
&.select { &:disabled, &[disabled=disabled], &.disabled {
padding: 0;
}
&:disabled, &[disabled=disabled] {
cursor: not-allowed; cursor: not-allowed;
opacity: 0.5; opacity: 0.5;
} }
.icon-down-open {
position: absolute;
top: 0;
bottom: 0;
right: 5px;
height: 100%;
color: $fallback--text;
color: var(--inputText, $fallback--text);
line-height: 28px;
z-index: 0;
pointer-events: none;
}
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: transparent;
border: none;
color: $fallback--text;
color: var(--inputText, --text, $fallback--text);
margin: 0;
padding: 0 2em 0 .2em;
font-family: sans-serif;
font-family: var(--inputFont, sans-serif);
font-size: 14px;
width: 100%;
z-index: 1;
height: 28px;
line-height: 16px;
}
&[type=range] { &[type=range] {
background: none; background: none;
border: none; border: none;
@ -279,7 +288,7 @@ input, textarea, .select, .input {
+ label::before { + label::before {
flex-shrink: 0; flex-shrink: 0;
display: inline-block; display: inline-block;
content: ''; content: '';
transition: color 200ms; transition: color 200ms;
width: 1.1em; width: 1.1em;
height: 1.1em; height: 1.1em;
@ -300,6 +309,10 @@ input, textarea, .select, .input {
box-sizing: border-box; box-sizing: border-box;
} }
} }
&.resize-height {
resize: vertical;
}
} }
option { option {
@ -318,7 +331,7 @@ option {
} }
} }
i[class*=icon-] { i[class*=icon-], .svg-inline--fa {
color: $fallback--icon; color: $fallback--icon;
color: var(--icon, $fallback--icon); color: var(--icon, $fallback--icon);
} }
@ -356,117 +369,10 @@ i[class*=icon-] {
padding: 0 10px 0 10px; padding: 0 10px 0 10px;
} }
.item {
flex: 1;
line-height: 50px;
height: 50px;
overflow: hidden;
display: flex;
flex-wrap: wrap;
.nav-icon {
margin-left: 0.4em;
}
&.right {
justify-content: flex-end;
}
}
.auto-size { .auto-size {
flex: 1 flex: 1
} }
.nav-bar {
padding: 0;
width: 100%;
align-items: center;
position: fixed;
height: 50px;
box-sizing: border-box;
button {
&, i[class*=icon-] {
color: $fallback--text;
color: var(--btnTopBarText, $fallback--text);
}
&:active {
background-color: $fallback--fg;
background-color: var(--btnPressedTopBar, $fallback--fg);
color: $fallback--text;
color: var(--btnPressedTopBarText, $fallback--text);
}
&:disabled {
color: $fallback--text;
color: var(--btnDisabledTopBarText, $fallback--text);
}
&.toggled {
color: $fallback--text;
color: var(--btnToggledTopBarText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnToggledTopBar, $fallback--fg)
}
}
.logo {
display: flex;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
align-items: stretch;
justify-content: center;
flex: 0 0 auto;
z-index: -1;
transition: opacity;
transition-timing-function: ease-out;
transition-duration: 100ms;
.mask {
mask-repeat: no-repeat;
mask-position: center;
mask-size: contain;
background-color: $fallback--fg;
background-color: var(--topBarText, $fallback--fg);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
img {
height: 100%;
object-fit: contain;
display: block;
flex: 0;
}
}
.inner-nav {
position: relative;
margin: auto;
box-sizing: border-box;
padding-left: 10px;
padding-right: 10px;
display: flex;
align-items: center;
flex-basis: 970px;
height: 50px;
a, a i {
color: $fallback--link;
color: var(--topBarLink, $fallback--link);
}
}
}
main-router { main-router {
flex: 1; flex: 1;
} }
@ -546,6 +452,7 @@ main-router {
color: $fallback--faint; color: $fallback--faint;
color: var(--panelFaint, $fallback--faint); color: var(--panelFaint, $fallback--faint);
} }
.faint-link { .faint-link {
color: $fallback--faint; color: $fallback--faint;
color: var(--faintLink, $fallback--faint); color: var(--faintLink, $fallback--faint);
@ -557,11 +464,8 @@ main-router {
overflow-x: hidden; overflow-x: hidden;
} }
button { .button-default,
flex-shrink: 0; .alert {
}
button, .alert {
// height: 100%; // height: 100%;
line-height: 21px; line-height: 21px;
min-height: 0; min-height: 0;
@ -572,8 +476,11 @@ main-router {
align-self: stretch; align-self: stretch;
} }
button { .button-default {
&, i[class*=icon-] { flex-shrink: 0;
&,
i[class*=icon-] {
color: $fallback--text; color: $fallback--text;
color: var(--btnPanelText, $fallback--text); color: var(--btnPanelText, $fallback--text);
} }
@ -596,7 +503,8 @@ main-router {
} }
} }
a { a,
.-link {
color: $fallback--link; color: $fallback--link;
color: var(--panelLink, $fallback--link) color: var(--panelLink, $fallback--link)
} }
@ -607,19 +515,31 @@ main-router {
border-radius: var(--panelRadius, $fallback--panelRadius); border-radius: var(--panelRadius, $fallback--panelRadius);
} }
.panel-footer { /* TODO Should remove timeline-footer from here when we refactor panels into
* separate component and utilize slots
*/
.panel-footer, .timeline-footer {
display: flex;
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius; border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius); border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
flex: none;
padding: 0.6em 0.6em;
text-align: left;
line-height: 28px;
align-items: baseline;
border-width: 1px 0 0 0;
border-style: solid;
border-color: var(--border, $fallback--border);
.faint { .faint {
color: $fallback--faint; color: $fallback--faint;
color: var(--panelFaint, $fallback--faint); color: var(--panelFaint, $fallback--faint);
} }
a { a,
.-link {
color: $fallback--link; color: $fallback--link;
color: var(--panelLink, $fallback--link) color: var(--panelLink, $fallback--link);
} }
} }
@ -646,12 +566,13 @@ nav {
color: var(--faint, $fallback--faint); color: var(--faint, $fallback--faint);
box-shadow: 0px 0px 4px rgba(0,0,0,.6); box-shadow: 0px 0px 4px rgba(0,0,0,.6);
box-shadow: var(--topBarShadow); box-shadow: var(--topBarShadow);
box-sizing: border-box;
} }
.fade-enter-active, .fade-leave-active { .fade-enter-active, .fade-leave-active {
transition: opacity .2s transition: opacity .2s
} }
.fade-enter, .fade-leave-active { .fade-enter-from, .fade-leave-active {
opacity: 0 opacity: 0
} }
@ -707,19 +628,24 @@ nav {
flex-grow: 0; flex-grow: 0;
} }
} }
.badge { .badge {
box-sizing: border-box;
display: inline-block; display: inline-block;
border-radius: 99px; border-radius: 99px;
min-width: 22px; max-width: 10em;
max-width: 22px; min-width: 1.7em;
min-height: 22px; height: 1.3em;
max-height: 22px; padding: 0.15em 0.15em;
font-size: 15px;
line-height: 22px;
text-align: center;
vertical-align: middle; vertical-align: middle;
font-weight: normal;
font-style: normal;
font-size: 0.9em;
line-height: 1;
text-align: center;
white-space: nowrap; white-space: nowrap;
padding: 0; overflow: hidden;
text-overflow: ellipsis;
&.badge-notification { &.badge-notification {
background-color: $fallback--cRed; background-color: $fallback--cRed;
@ -760,6 +686,15 @@ nav {
color: var(--alertWarningPanelText, $fallback--text); color: var(--alertWarningPanelText, $fallback--text);
} }
} }
&.success {
background-color: var(--alertSuccess, $fallback--alertWarning);
color: var(--alertSuccessText, $fallback--text);
.panel-heading & {
color: var(--alertSuccessPanelText, $fallback--text);
}
}
} }
.faint { .faint {
@ -776,16 +711,6 @@ nav {
} }
} }
@media all and (min-width: 800px) {
.logo {
opacity: 1 !important;
}
}
.item.right {
text-align: right;
}
.visibility-notice { .visibility-notice {
padding: .5em; padding: .5em;
border: 1px solid $fallback--faint; border: 1px solid $fallback--faint;
@ -807,8 +732,16 @@ nav {
} }
} }
.button-icon { .fa-scale-110 {
font-size: 1.2em; &.svg-inline--fa {
font-size: 1.1em;
}
}
.fa-old-padding {
&.svg-inline--fa {
padding: 0 0.3em;
}
} }
@keyframes shakeError { @keyframes shakeError {
@ -865,13 +798,6 @@ nav {
} }
} }
.select-multiple {
display: flex;
.option-list {
margin: 0;
padding-left: .5em;
}
}
.setting-list, .setting-list,
.option-list{ .option-list{
list-style-type: none; list-style-type: none;
@ -898,7 +824,7 @@ nav {
} }
} }
.btn.btn-default { .btn.button-default {
min-height: 28px; min-height: 28px;
} }
@ -918,29 +844,10 @@ nav {
} }
.new-status-notification { .new-status-notification {
position:relative; position: relative;
margin-top: -1px;
font-size: 1.1em; font-size: 1.1em;
border-width: 1px 0 0 0;
border-style: solid;
border-color: var(--border, $fallback--border);
padding: 10px;
z-index: 1; z-index: 1;
background-color: $fallback--fg; flex: 1;
background-color: var(--panel, $fallback--fg);
}
.unread-chat-count {
font-size: 0.9em;
font-weight: bolder;
font-style: normal;
position: absolute;
right: 0.6rem;
padding: 0 0.3em;
min-width: 1.3rem;
min-height: 1.3rem;
max-height: 1.3rem;
line-height: 1.3rem;
} }
.chat-layout { .chat-layout {
@ -948,6 +855,11 @@ nav {
overflow: hidden; overflow: hidden;
height: 100%; height: 100%;
// Get rid of scrollbar on body as scrolling happens on different element
body {
overflow: hidden;
}
// Ensures the fixed position of the mobile browser bars on scroll up / down events. // Ensures the fixed position of the mobile browser bars on scroll up / down events.
// Prevents the mobile browser bars from overlapping or hiding the message posting form. // Prevents the mobile browser bars from overlapping or hiding the message posting form.
@media all and (max-width: 800px) { @media all and (max-width: 800px) {

View file

@ -1,82 +1,14 @@
<template> <template>
<div <div
id="app" id="app-loaded"
:style="bgAppStyle" :style="bgStyle"
> >
<div <div
id="app_bg_wrapper" id="app_bg_wrapper"
class="app-bg-wrapper" class="app-bg-wrapper"
:style="bgStyle"
/> />
<MobileNav v-if="isMobileLayout" /> <MobileNav v-if="isMobileLayout" />
<nav <DesktopNav v-else />
v-else
id="nav"
class="nav-bar container"
@click="scrollToTop()"
>
<div class="inner-nav">
<div
class="logo"
:style="logoBgStyle"
>
<div
class="mask"
:style="logoMaskStyle"
/>
<img
:src="logo"
:style="logoStyle"
>
</div>
<div class="item">
<router-link
v-if="!hideSitename"
class="site-name"
:to="{ name: 'root' }"
active-class="home"
>
{{ sitename }}
</router-link>
</div>
<div class="item right">
<search-bar
v-if="currentUser || !privateMode"
class="nav-icon mobile-hidden"
@toggled="onSearchBarToggled"
@click.stop.native
/>
<a
href="#"
class="mobile-hidden"
@click.stop="openSettingsModal"
>
<i
class="button-icon icon-cog nav-icon"
:title="$t('nav.preferences')"
/>
</a>
<a
v-if="currentUser && currentUser.role === 'admin'"
href="/pleroma/admin/#/login-pleroma"
class="mobile-hidden"
target="_blank"
><i
class="button-icon icon-gauge nav-icon"
:title="$t('nav.administration')"
/></a>
<a
v-if="currentUser"
href="#"
class="mobile-hidden"
@click.prevent="logout"
><i
class="button-icon icon-logout nav-icon"
:title="$t('login.logout')"
/></a>
</div>
</div>
</nav>
<div class="app-bg-wrapper app-container-wrapper" /> <div class="app-bg-wrapper app-container-wrapper" />
<div <div
id="content" id="content"
@ -117,16 +49,17 @@
</div> </div>
<media-modal /> <media-modal />
</div> </div>
<chat-panel <shout-panel
v-if="currentUser && chat" v-if="currentUser && shout && !hideShoutbox"
:floating="true" :floating="true"
class="floating-chat mobile-hidden" class="floating-shout mobile-hidden"
:class="{ 'left': shoutboxPosition }"
/> />
<MobilePostStatusButton /> <MobilePostStatusButton />
<UserReportingModal /> <UserReportingModal />
<PostStatusModal /> <PostStatusModal />
<SettingsModal /> <SettingsModal />
<portal-target name="modal" /> <div id="modal" />
<GlobalNoticeList /> <GlobalNoticeList />
</div> </div>
</template> </template>

View file

@ -30,3 +30,5 @@ $fallback--attachmentRadius: 10px;
$fallback--chatMessageRadius: 10px; $fallback--chatMessageRadius: 10px;
$fallback--buttonShadow: 0px 0px 2px 0px rgba(0, 0, 0, 1), 0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px 0px rgba(0, 0, 0, 0.2) inset; $fallback--buttonShadow: 0px 0px 2px 0px rgba(0, 0, 0, 1), 0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px 0px rgba(0, 0, 0, 0.2) inset;
$status-margin: 0.75em;

View file

@ -1,12 +1,19 @@
import Vue from 'vue' import { createApp } from 'vue'
import VueRouter from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
import routes from './routes' import vClickOutside from 'click-outside-vue3'
import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome'
import App from '../App.vue' import App from '../App.vue'
import routes from './routes'
import VBodyScrollLock from 'src/directives/body_scroll_lock'
import { windowWidth } from '../services/window_utils/window_utils' import { windowWidth } from '../services/window_utils/window_utils'
import { getOrCreateApp, getClientToken } from '../services/new_api/oauth.js' import { getOrCreateApp, getClientToken } from '../services/new_api/oauth.js'
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js' import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js'
import { applyTheme } from '../services/style_setter/style_setter.js' import { applyTheme } from '../services/style_setter/style_setter.js'
import FaviconService from '../services/favicon_service/favicon_service.js'
let staticInitialResults = null let staticInitialResults = null
@ -50,6 +57,7 @@ const getInstanceConfig = async ({ store }) => {
const vapidPublicKey = data.pleroma.vapid_public_key const vapidPublicKey = data.pleroma.vapid_public_key
store.dispatch('setInstanceOption', { name: 'textlimit', value: textlimit }) store.dispatch('setInstanceOption', { name: 'textlimit', value: textlimit })
store.dispatch('setInstanceOption', { name: 'accountApprovalRequired', value: data.approval_required })
if (vapidPublicKey) { if (vapidPublicKey) {
store.dispatch('setInstanceOption', { name: 'vapidPublicKey', value: vapidPublicKey }) store.dispatch('setInstanceOption', { name: 'vapidPublicKey', value: vapidPublicKey })
@ -113,6 +121,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
copyInstanceOption('nsfwCensorImage') copyInstanceOption('nsfwCensorImage')
copyInstanceOption('background') copyInstanceOption('background')
copyInstanceOption('hidePostStats') copyInstanceOption('hidePostStats')
copyInstanceOption('hideBotIndication')
copyInstanceOption('hideUserStats') copyInstanceOption('hideUserStats')
copyInstanceOption('hideFilteredStatuses') copyInstanceOption('hideFilteredStatuses')
copyInstanceOption('logo') copyInstanceOption('logo')
@ -130,6 +139,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
? 0 ? 0
: config.logoMargin : config.logoMargin
}) })
copyInstanceOption('logoLeft')
store.commit('authFlow/setInitialStrategy', config.loginMethod) store.commit('authFlow/setInitialStrategy', config.loginMethod)
copyInstanceOption('redirectRootNoLogin') copyInstanceOption('redirectRootNoLogin')
@ -237,7 +247,7 @@ const getNodeInfo = async ({ store }) => {
store.dispatch('setInstanceOption', { name: 'registrationOpen', value: data.openRegistrations }) store.dispatch('setInstanceOption', { name: 'registrationOpen', value: data.openRegistrations })
store.dispatch('setInstanceOption', { name: 'mediaProxyAvailable', value: features.includes('media_proxy') }) store.dispatch('setInstanceOption', { name: 'mediaProxyAvailable', value: features.includes('media_proxy') })
store.dispatch('setInstanceOption', { name: 'safeDM', value: features.includes('safe_dm_mentions') }) store.dispatch('setInstanceOption', { name: 'safeDM', value: features.includes('safe_dm_mentions') })
store.dispatch('setInstanceOption', { name: 'chatAvailable', value: features.includes('chat') }) store.dispatch('setInstanceOption', { name: 'shoutAvailable', value: features.includes('chat') })
store.dispatch('setInstanceOption', { name: 'pleromaChatMessagesAvailable', value: features.includes('pleroma_chat_messages') }) store.dispatch('setInstanceOption', { name: 'pleromaChatMessagesAvailable', value: features.includes('pleroma_chat_messages') })
store.dispatch('setInstanceOption', { name: 'gopherAvailable', value: features.includes('gopher') }) store.dispatch('setInstanceOption', { name: 'gopherAvailable', value: features.includes('gopher') })
store.dispatch('setInstanceOption', { name: 'pollsAvailable', value: features.includes('polls') }) store.dispatch('setInstanceOption', { name: 'pollsAvailable', value: features.includes('polls') })
@ -325,6 +335,8 @@ const afterStoreSetup = async ({ store, i18n }) => {
const width = windowWidth() const width = windowWidth()
store.dispatch('setMobileLayout', width <= 800) store.dispatch('setMobileLayout', width <= 800)
FaviconService.initFaviconService()
const overrides = window.___pleromafe_dev_overrides || {} const overrides = window.___pleromafe_dev_overrides || {}
const server = (typeof overrides.target !== 'undefined') ? overrides.target : window.location.origin const server = (typeof overrides.target !== 'undefined') ? overrides.target : window.location.origin
store.dispatch('setInstanceOption', { name: 'server', value: server }) store.dispatch('setInstanceOption', { name: 'server', value: server })
@ -361,25 +373,32 @@ const afterStoreSetup = async ({ store, i18n }) => {
getTOS({ store }) getTOS({ store })
getStickers({ store }) getStickers({ store })
const router = new VueRouter({ const router = createRouter({
mode: 'history', history: createWebHistory(),
routes: routes(store), routes: routes(store),
scrollBehavior: (to, _from, savedPosition) => { scrollBehavior: (to, _from, savedPosition) => {
if (to.matched.some(m => m.meta.dontScroll)) { if (to.matched.some(m => m.meta.dontScroll)) {
return false return false
} }
return savedPosition || { x: 0, y: 0 } return savedPosition || { left: 0, top: 0 }
} }
}) })
/* eslint-disable no-new */ const app = createApp(App)
return new Vue({
router, app.use(router)
store, app.use(store)
i18n, app.use(i18n)
el: '#app',
render: h => h(App) app.use(vClickOutside)
}) app.use(VBodyScrollLock)
app.component('FAIcon', FontAwesomeIcon)
app.component('FALayers', FontAwesomeLayers)
app.mount('#app')
return app
} }
export default afterStoreSetup export default afterStoreSetup

View file

@ -16,7 +16,7 @@ import FollowRequests from 'components/follow_requests/follow_requests.vue'
import OAuthCallback from 'components/oauth_callback/oauth_callback.vue' import OAuthCallback from 'components/oauth_callback/oauth_callback.vue'
import Notifications from 'components/notifications/notifications.vue' import Notifications from 'components/notifications/notifications.vue'
import AuthForm from 'components/auth_form/auth_form.js' import AuthForm from 'components/auth_form/auth_form.js'
import ChatPanel from 'components/chat_panel/chat_panel.vue' import ShoutPanel from 'components/shout_panel/shout_panel.vue'
import WhoToFollow from 'components/who_to_follow/who_to_follow.vue' import WhoToFollow from 'components/who_to_follow/who_to_follow.vue'
import About from 'components/about/about.vue' import About from 'components/about/about.vue'
import RemoteUserResolver from 'components/remote_user_resolver/remote_user_resolver.vue' import RemoteUserResolver from 'components/remote_user_resolver/remote_user_resolver.vue'
@ -46,7 +46,7 @@ export default (store) => {
{ name: 'bookmarks', path: '/bookmarks', component: BookmarkTimeline }, { name: 'bookmarks', path: '/bookmarks', component: BookmarkTimeline },
{ name: 'conversation', path: '/notice/:id', component: ConversationPage, meta: { dontScroll: true } }, { name: 'conversation', path: '/notice/:id', component: ConversationPage, meta: { dontScroll: true } },
{ name: 'remote-user-profile-acct', { name: 'remote-user-profile-acct',
path: '/remote-users/(@?):username([^/@]+)@:hostname([^/@]+)', path: '/remote-users/:_(@)?:username([^/@]+)@:hostname([^/@]+)',
component: RemoteUserResolver, component: RemoteUserResolver,
beforeEnter: validateAuthenticatedRoute beforeEnter: validateAuthenticatedRoute
}, },
@ -64,12 +64,12 @@ export default (store) => {
{ name: 'friend-requests', path: '/friend-requests', component: FollowRequests, beforeEnter: validateAuthenticatedRoute }, { name: 'friend-requests', path: '/friend-requests', component: FollowRequests, beforeEnter: validateAuthenticatedRoute },
{ name: 'notifications', path: '/:username/notifications', component: Notifications, beforeEnter: validateAuthenticatedRoute }, { name: 'notifications', path: '/:username/notifications', component: Notifications, beforeEnter: validateAuthenticatedRoute },
{ name: 'login', path: '/login', component: AuthForm }, { name: 'login', path: '/login', component: AuthForm },
{ name: 'chat-panel', path: '/chat-panel', component: ChatPanel, props: () => ({ floating: false }) }, { name: 'shout-panel', path: '/shout-panel', component: ShoutPanel, props: () => ({ floating: false }) },
{ name: 'oauth-callback', path: '/oauth-callback', component: OAuthCallback, props: (route) => ({ code: route.query.code }) }, { name: 'oauth-callback', path: '/oauth-callback', component: OAuthCallback, props: (route) => ({ code: route.query.code }) },
{ name: 'search', path: '/search', component: Search, props: (route) => ({ query: route.query.query }) }, { name: 'search', path: '/search', component: Search, props: (route) => ({ query: route.query.query }) },
{ name: 'who-to-follow', path: '/who-to-follow', component: WhoToFollow, beforeEnter: validateAuthenticatedRoute }, { name: 'who-to-follow', path: '/who-to-follow', component: WhoToFollow, beforeEnter: validateAuthenticatedRoute },
{ name: 'about', path: '/about', component: About }, { name: 'about', path: '/about', component: About },
{ name: 'user-profile', path: '/(users/)?:name', component: UserProfile } { name: 'user-profile', path: '/:_(users)?/:name', component: UserProfile }
] ]
if (store.state.instance.pleromaChatMessagesAvailable) { if (store.state.instance.pleromaChatMessagesAvailable) {

View file

@ -1,6 +1,14 @@
import { mapState } from 'vuex' import { mapState } from 'vuex'
import ProgressButton from '../progress_button/progress_button.vue' import ProgressButton from '../progress_button/progress_button.vue'
import Popover from '../popover/popover.vue' import Popover from '../popover/popover.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faEllipsisV
} from '@fortawesome/free-solid-svg-icons'
library.add(
faEllipsisV
)
const AccountActions = { const AccountActions = {
props: [ props: [
@ -27,7 +35,7 @@ const AccountActions = {
this.$store.dispatch('unblockUser', this.user.id) this.$store.dispatch('unblockUser', this.user.id)
}, },
reportUser () { reportUser () {
this.$store.dispatch('openUserReportingModal', this.user.id) this.$store.dispatch('openUserReportingModal', { userId: this.user.id })
}, },
openChat () { openChat () {
this.$router.push({ this.$router.push({

View file

@ -1,26 +1,24 @@
<template> <template>
<div class="account-actions"> <div class="AccountActions">
<Popover <Popover
trigger="click" trigger="click"
placement="bottom" placement="bottom"
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
remove-padding
> >
<div <template v-slot:content>
slot="content"
class="account-tools-popover"
>
<div class="dropdown-menu"> <div class="dropdown-menu">
<template v-if="relationship.following"> <template v-if="relationship.following">
<button <button
v-if="relationship.showing_reblogs" v-if="relationship.showing_reblogs"
class="btn btn-default dropdown-item" class="btn button-default dropdown-item"
@click="hideRepeats" @click="hideRepeats"
> >
{{ $t('user_card.hide_repeats') }} {{ $t('user_card.hide_repeats') }}
</button> </button>
<button <button
v-if="!relationship.showing_reblogs" v-if="!relationship.showing_reblogs"
class="btn btn-default dropdown-item" class="btn button-default dropdown-item"
@click="showRepeats" @click="showRepeats"
> >
{{ $t('user_card.show_repeats') }} {{ $t('user_card.show_repeats') }}
@ -32,39 +30,41 @@
</template> </template>
<button <button
v-if="relationship.blocking" v-if="relationship.blocking"
class="btn btn-default btn-block dropdown-item" class="btn button-default btn-block dropdown-item"
@click="unblockUser" @click="unblockUser"
> >
{{ $t('user_card.unblock') }} {{ $t('user_card.unblock') }}
</button> </button>
<button <button
v-else v-else
class="btn btn-default btn-block dropdown-item" class="btn button-default btn-block dropdown-item"
@click="blockUser" @click="blockUser"
> >
{{ $t('user_card.block') }} {{ $t('user_card.block') }}
</button> </button>
<button <button
class="btn btn-default btn-block dropdown-item" class="btn button-default btn-block dropdown-item"
@click="reportUser" @click="reportUser"
> >
{{ $t('user_card.report') }} {{ $t('user_card.report') }}
</button> </button>
<button <button
v-if="pleromaChatMessagesAvailable" v-if="pleromaChatMessagesAvailable"
class="btn btn-default btn-block dropdown-item" class="btn button-default btn-block dropdown-item"
@click="openChat" @click="openChat"
> >
{{ $t('user_card.message') }} {{ $t('user_card.message') }}
</button> </button>
</div> </div>
</div> </template>
<div <template v-slot:trigger>
slot="trigger" <button class="button-unstyled ellipsis-button">
class="btn btn-default ellipsis-button" <FAIcon
> class="icon"
<i class="icon-ellipsis trigger-button" /> icon="ellipsis-v"
</div> />
</button>
</template>
</Popover> </Popover>
</div> </div>
</template> </template>
@ -73,22 +73,21 @@
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.account-actions { .AccountActions {
margin: 0 .8em; button.dropdown-item {
} margin-left: 0;
}
.account-actions button.dropdown-item { .ellipsis-button {
margin-left: 0; width: 2.5em;
} margin: -0.5em 0;
padding: 0.5em 0;
text-align: center;
.account-actions .trigger-button { &:not(:hover) .icon {
color: $fallback--lightText; color: $fallback--lightText;
color: var(--lightText, $fallback--lightText); color: var(--lightText, $fallback--lightText);
opacity: .8; }
cursor: pointer;
&:hover {
color: $fallback--text;
color: var(--text, $fallback--text);
} }
} }
</style> </style>

View file

@ -8,7 +8,7 @@
{{ $t('general.error_retry') }} {{ $t('general.error_retry') }}
</p> </p>
<button <button
class="btn" class="btn button-default"
@click="retry" @click="retry"
> >
{{ $t('general.retry') }} {{ $t('general.retry') }}
@ -19,6 +19,7 @@
<script> <script>
export default { export default {
emits: ['resetAsyncComponent'],
methods: { methods: {
retry () { retry () {
this.$emit('resetAsyncComponent') this.$emit('resetAsyncComponent')

View file

@ -1,36 +1,88 @@
import StillImage from '../still-image/still-image.vue' import StillImage from '../still-image/still-image.vue'
import Flash from '../flash/flash.vue'
import VideoAttachment from '../video_attachment/video_attachment.vue' import VideoAttachment from '../video_attachment/video_attachment.vue'
import nsfwImage from '../../assets/nsfw.png' import nsfwImage from '../../assets/nsfw.png'
import fileTypeService from '../../services/file_type/file_type.service.js' import fileTypeService from '../../services/file_type/file_type.service.js'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faFile,
faMusic,
faImage,
faVideo,
faPlayCircle,
faTimes,
faStop,
faSearchPlus,
faTrashAlt,
faPencilAlt,
faAlignRight
} from '@fortawesome/free-solid-svg-icons'
library.add(
faFile,
faMusic,
faImage,
faVideo,
faPlayCircle,
faTimes,
faStop,
faSearchPlus,
faTrashAlt,
faPencilAlt,
faAlignRight
)
const Attachment = { const Attachment = {
props: [ props: [
'attachment', 'attachment',
'description',
'hideDescription',
'nsfw', 'nsfw',
'size', 'size',
'allowPlay',
'setMedia', 'setMedia',
'naturalSizeLoad' 'remove',
'shiftUp',
'shiftDn',
'edit'
], ],
data () { data () {
return { return {
localDescription: this.description || this.attachment.description,
nsfwImage: this.$store.state.instance.nsfwCensorImage || nsfwImage, nsfwImage: this.$store.state.instance.nsfwCensorImage || nsfwImage,
hideNsfwLocal: this.$store.getters.mergedConfig.hideNsfw, hideNsfwLocal: this.$store.getters.mergedConfig.hideNsfw,
preloadImage: this.$store.getters.mergedConfig.preloadImage, preloadImage: this.$store.getters.mergedConfig.preloadImage,
loading: false, loading: false,
img: fileTypeService.fileType(this.attachment.mimetype) === 'image' && document.createElement('img'), img: fileTypeService.fileType(this.attachment.mimetype) === 'image' && document.createElement('img'),
modalOpen: false, modalOpen: false,
showHidden: false showHidden: false,
flashLoaded: false,
showDescription: false
} }
}, },
components: { components: {
Flash,
StillImage, StillImage,
VideoAttachment VideoAttachment
}, },
computed: { computed: {
classNames () {
return [
{
'-loading': this.loading,
'-nsfw-placeholder': this.hidden,
'-editable': this.edit !== undefined
},
'-type-' + this.type,
this.size && '-size-' + this.size,
`-${this.useContainFit ? 'contain' : 'cover'}-fit`
]
},
usePlaceholder () { usePlaceholder () {
return this.size === 'hide' || this.type === 'unknown' return this.size === 'hide'
},
useContainFit () {
return this.$store.getters.mergedConfig.useContainFit
}, },
placeholderName () { placeholderName () {
if (this.attachment.description === '' || !this.attachment.description) { if (this.attachment.description === '' || !this.attachment.description) {
@ -39,10 +91,10 @@ const Attachment = {
return this.attachment.description return this.attachment.description
}, },
placeholderIconClass () { placeholderIconClass () {
if (this.type === 'image') return 'icon-picture' if (this.type === 'image') return 'image'
if (this.type === 'video') return 'icon-video' if (this.type === 'video') return 'video'
if (this.type === 'audio') return 'icon-music' if (this.type === 'audio') return 'music'
return 'icon-doc' return 'file'
}, },
referrerpolicy () { referrerpolicy () {
return this.$store.state.instance.mediaProxyAvailable ? '' : 'no-referrer' return this.$store.state.instance.mediaProxyAvailable ? '' : 'no-referrer'
@ -54,24 +106,33 @@ const Attachment = {
return this.nsfw && this.hideNsfwLocal && !this.showHidden return this.nsfw && this.hideNsfwLocal && !this.showHidden
}, },
isEmpty () { isEmpty () {
return (this.type === 'html' && !this.attachment.oembed) || this.type === 'unknown' return (this.type === 'html' && !this.attachment.oembed)
},
isSmall () {
return this.size === 'small'
},
fullwidth () {
if (this.size === 'hide') return false
return this.type === 'html' || this.type === 'audio' || this.type === 'unknown'
}, },
useModal () { useModal () {
const modalTypes = this.size === 'hide' ? ['image', 'video', 'audio'] let modalTypes = []
: this.mergedConfig.playVideosInModal switch (this.size) {
? ['image', 'video'] case 'hide':
: ['image'] case 'small':
modalTypes = ['image', 'video', 'audio', 'flash']
break
default:
modalTypes = this.mergedConfig.playVideosInModal
? ['image', 'video', 'flash']
: ['image']
break
}
return modalTypes.includes(this.type) return modalTypes.includes(this.type)
}, },
videoTag () {
return this.useModal ? 'button' : 'span'
},
...mapGetters(['mergedConfig']) ...mapGetters(['mergedConfig'])
}, },
watch: {
localDescription (newVal) {
this.onEdit(newVal)
}
},
methods: { methods: {
linkClicked ({ target }) { linkClicked ({ target }) {
if (target.tagName === 'A') { if (target.tagName === 'A') {
@ -80,12 +141,37 @@ const Attachment = {
}, },
openModal (event) { openModal (event) {
if (this.useModal) { if (this.useModal) {
event.stopPropagation() this.$emit('setMedia')
event.preventDefault() this.$store.dispatch('setCurrentMedia', this.attachment)
this.setMedia() } else if (this.type === 'unknown') {
this.$store.dispatch('setCurrent', this.attachment) window.open(this.attachment.url)
} }
}, },
openModalForce (event) {
this.$emit('setMedia')
this.$store.dispatch('setCurrentMedia', this.attachment)
},
onEdit (event) {
this.edit && this.edit(this.attachment, event)
},
onRemove () {
this.remove && this.remove(this.attachment)
},
onShiftUp () {
this.shiftUp && this.shiftUp(this.attachment)
},
onShiftDn () {
this.shiftDn && this.shiftDn(this.attachment)
},
stopFlash () {
this.$refs.flash.closePlayer()
},
setFlashLoaded (event) {
this.flashLoaded = event
},
toggleDescription () {
this.showDescription = !this.showDescription
},
toggleHidden (event) { toggleHidden (event) {
if ( if (
(this.mergedConfig.useOneClickNsfw && !this.showHidden) && (this.mergedConfig.useOneClickNsfw && !this.showHidden) &&
@ -112,7 +198,7 @@ const Attachment = {
onImageLoad (image) { onImageLoad (image) {
const width = image.naturalWidth const width = image.naturalWidth
const height = image.naturalHeight const height = image.naturalHeight
this.naturalSizeLoad && this.naturalSizeLoad({ width, height }) this.$emit('naturalSizeLoad', { id: this.attachment.id, width, height })
} }
} }
} }

View file

@ -0,0 +1,268 @@
@import '../../_variables.scss';
.Attachment {
display: inline-flex;
flex-direction: column;
position: relative;
align-self: flex-start;
line-height: 0;
height: 100%;
border-style: solid;
border-width: 1px;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
.attachment-wrapper {
flex: 1 1 auto;
height: 100%;
position: relative;
overflow: hidden;
}
.description-container {
flex: 0 1 0;
display: flex;
padding-top: 0.5em;
z-index: 1;
p {
flex: 1;
text-align: center;
line-height: 1.5;
padding: 0.5em;
margin: 0;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
&.-static {
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding-top: 0;
background: var(--popover);
box-shadow: var(--popupShadow);
}
}
.description-field {
flex: 1;
min-width: 0;
}
& .placeholder-container,
& .image-container,
& .audio-container,
& .video-container,
& .flash-container,
& .oembed-container {
display: flex;
justify-content: center;
width: 100%;
height: 100%;
}
.image-container {
.image {
width: 100%;
height: 100%;
}
}
& .flash-container,
& .video-container {
& .flash,
& video {
width: 100%;
height: 100%;
object-fit: contain;
align-self: center;
}
}
.audio-container {
display: flex;
align-items: flex-end;
audio {
width: 100%;
height: 100%;
}
}
.placeholder-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding-top: 0.5em;
}
.play-icon {
position: absolute;
font-size: 64px;
top: calc(50% - 32px);
left: calc(50% - 32px);
color: rgba(255, 255, 255, 0.75);
text-shadow: 0 0 2px rgba(0, 0, 0, 0.4);
&::before {
margin: 0;
}
}
.attachment-buttons {
display: flex;
position: absolute;
right: 0;
top: 0;
margin-top: 0.5em;
margin-right: 0.5em;
z-index: 1;
.attachment-button {
padding: 0;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
text-align: center;
width: 2em;
height: 2em;
margin-left: 0.5em;
font-size: 1.25em;
// TODO: theming? hard to theme with unknown background image color
background: rgba(230, 230, 230, 0.7);
.svg-inline--fa {
color: rgba(0, 0, 0, 0.6);
}
&:hover .svg-inline--fa {
color: rgba(0, 0, 0, 0.9);
}
}
}
.oembed-container {
line-height: 1.2em;
flex: 1 0 100%;
width: 100%;
margin-right: 15px;
display: flex;
img {
width: 100%;
}
.image {
flex: 1;
img {
border: 0px;
border-radius: 5px;
height: 100%;
object-fit: cover;
}
}
.text {
flex: 2;
margin: 8px;
word-break: break-all;
h1 {
font-size: 14px;
margin: 0px;
}
}
}
&.-size-small {
.play-icon {
zoom: 0.5;
opacity: 0.7;
}
.attachment-buttons {
zoom: 0.7;
opacity: 0.5;
}
}
&.-editable {
padding: 0.5em;
& .description-container,
& .attachment-buttons {
margin: 0;
}
}
&.-placeholder {
display: inline-block;
color: $fallback--link;
color: var(--postLink, $fallback--link);
overflow: hidden;
white-space: nowrap;
height: auto;
line-height: 1.5;
&:not(.-editable) {
border: none;
}
&.-editable {
display: flex;
flex-direction: row;
align-items: baseline;
& .description-container,
& .attachment-buttons {
margin: 0;
padding: 0;
position: relative;
}
.description-container {
flex: 1;
padding-left: 0.5em;
}
.attachment-buttons {
order: 99;
align-self: center;
}
}
a {
display: inline-block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
svg {
color: inherit;
}
}
&.-loading {
cursor: progress;
}
&.-contain-fit {
img,
canvas {
object-fit: contain;
}
}
&.-cover-fit {
img,
canvas {
object-fit: cover;
}
}
}

View file

@ -1,7 +1,8 @@
<template> <template>
<div <button
v-if="usePlaceholder" v-if="usePlaceholder"
:class="{ 'fullwidth': fullwidth }" class="Attachment -placeholder button-unstyled"
:class="classNames"
@click="openModal" @click="openModal"
> >
<a <a
@ -11,296 +12,257 @@
:href="attachment.url" :href="attachment.url"
:alt="attachment.description" :alt="attachment.description"
:title="attachment.description" :title="attachment.description"
@click.prevent
> >
<span :class="placeholderIconClass" /> <FAIcon :icon="placeholderIconClass" />
<b>{{ nsfw ? "NSFW / " : "" }}</b>{{ placeholderName }} <b>{{ nsfw ? "NSFW / " : "" }}</b>{{ edit ? '' : placeholderName }}
</a> </a>
</div> <div
v-if="edit || remove"
class="attachment-buttons"
>
<button
v-if="remove"
class="button-unstyled attachment-button"
@click.prevent="onRemove"
>
<FAIcon icon="trash-alt" />
</button>
</div>
<div
v-if="size !== 'hide' && !hideDescription && (edit || localDescription || showDescription)"
class="description-container"
:class="{ '-static': !edit }"
>
<input
v-if="edit"
v-model="localDescription"
type="text"
class="description-field"
:placeholder="$t('post_status.media_description')"
@keydown.enter.prevent=""
>
<p v-else>
{{ localDescription }}
</p>
</div>
</button>
<div <div
v-else v-else
v-show="!isEmpty" class="Attachment"
class="attachment" :class="classNames"
:class="{[type]: true, loading, 'fullwidth': fullwidth, 'nsfw-placeholder': hidden}"
> >
<a
v-if="hidden"
class="image-attachment"
:href="attachment.url"
:alt="attachment.description"
:title="attachment.description"
@click.prevent="toggleHidden"
>
<img
:key="nsfwImage"
class="nsfw"
:src="nsfwImage"
:class="{'small': isSmall}"
>
<i
v-if="type === 'video'"
class="play-icon icon-play-circled"
/>
</a>
<div <div
v-if="nsfw && hideNsfwLocal && !hidden" v-show="!isEmpty"
class="hider" class="attachment-wrapper"
> >
<a <a
href="#" v-if="hidden"
@click.prevent="toggleHidden" class="image-container"
>Hide</a> :href="attachment.url"
</div>
<a
v-if="type === 'image' && (!hidden || preloadImage)"
class="image-attachment"
:class="{'hidden': hidden && preloadImage }"
:href="attachment.url"
target="_blank"
@click="openModal"
>
<StillImage
class="image"
:referrerpolicy="referrerpolicy"
:mimetype="attachment.mimetype"
:src="attachment.large_thumb_url || attachment.url"
:image-load-handler="onImageLoad"
:alt="attachment.description" :alt="attachment.description"
/> :title="attachment.description"
</a> @click.prevent.stop="toggleHidden"
<a
v-if="type === 'video' && !hidden"
class="video-container"
:class="{'small': isSmall}"
:href="allowPlay ? undefined : attachment.url"
@click="openModal"
>
<VideoAttachment
class="video"
:attachment="attachment"
:controls="allowPlay"
/>
<i
v-if="!allowPlay"
class="play-icon icon-play-circled"
/>
</a>
<audio
v-if="type === 'audio'"
:src="attachment.url"
:alt="attachment.description"
:title="attachment.description"
controls
/>
<div
v-if="type === 'html' && attachment.oembed"
class="oembed"
@click.prevent="linkClicked"
>
<div
v-if="attachment.thumb_url"
class="image"
> >
<img :src="attachment.thumb_url"> <img
:key="nsfwImage"
class="nsfw"
:src="nsfwImage"
>
<FAIcon
v-if="type === 'video'"
class="play-icon"
icon="play-circle"
/>
</a>
<div
v-if="!hidden"
class="attachment-buttons"
>
<button
v-if="type === 'flash' && flashLoaded"
class="button-unstyled attachment-button"
:title="$t('status.attachment_stop_flash')"
@click.prevent="stopFlash"
>
<FAIcon icon="stop" />
</button>
<button
v-if="attachment.description && size !== 'small' && !edit && type !== 'unknown'"
class="button-unstyled attachment-button"
:title="$t('status.show_attachment_description')"
@click.prevent="toggleDescription"
>
<FAIcon icon="align-right" />
</button>
<button
v-if="!useModal && type !== 'unknown'"
class="button-unstyled attachment-button"
:title="$t('status.show_attachment_in_modal')"
@click.prevent="openModalForce"
>
<FAIcon icon="search-plus" />
</button>
<button
v-if="nsfw && hideNsfwLocal"
class="button-unstyled attachment-button"
:title="$t('status.hide_attachment')"
@click.prevent="toggleHidden"
>
<FAIcon icon="times" />
</button>
<button
v-if="shiftUp"
class="button-unstyled attachment-button"
:title="$t('status.move_up')"
@click.prevent="onShiftUp"
>
<FAIcon icon="chevron-left" />
</button>
<button
v-if="shiftDn"
class="button-unstyled attachment-button"
:title="$t('status.move_down')"
@click.prevent="onShiftDn"
>
<FAIcon icon="chevron-right" />
</button>
<button
v-if="remove"
class="button-unstyled attachment-button"
:title="$t('status.remove_attachment')"
@click.prevent="onRemove"
>
<FAIcon icon="trash-alt" />
</button>
</div> </div>
<div class="text">
<!-- eslint-disable vue/no-v-html --> <a
<h1><a :href="attachment.url">{{ attachment.oembed.title }}</a></h1> v-if="type === 'image' && (!hidden || preloadImage)"
<div v-html="attachment.oembed.oembedHTML" /> class="image-container"
<!-- eslint-enable vue/no-v-html --> :class="{'-hidden': hidden && preloadImage }"
:href="attachment.url"
target="_blank"
@click.stop.prevent="openModal"
>
<StillImage
class="image"
:referrerpolicy="referrerpolicy"
:mimetype="attachment.mimetype"
:src="attachment.large_thumb_url || attachment.url"
:image-load-handler="onImageLoad"
:alt="attachment.description"
/>
</a>
<a
v-if="type === 'unknown' && !hidden"
class="placeholder-container"
:href="attachment.url"
target="_blank"
>
<FAIcon
size="5x"
:icon="placeholderIconClass"
/>
<p>
{{ localDescription }}
</p>
</a>
<component
:is="videoTag"
v-if="type === 'video' && !hidden"
class="video-container"
:class="{ 'button-unstyled': 'isModal' }"
:href="attachment.url"
@click.stop.prevent="openModal"
>
<VideoAttachment
class="video"
:attachment="attachment"
:controls="!useModal"
@play="$emit('play')"
@pause="$emit('pause')"
/>
<FAIcon
v-if="useModal"
class="play-icon"
icon="play-circle"
/>
</component>
<span
v-if="type === 'audio' && !hidden"
class="audio-container"
:href="attachment.url"
@click.stop.prevent="openModal"
>
<audio
v-if="type === 'audio'"
:src="attachment.url"
:alt="attachment.description"
:title="attachment.description"
controls
@play="$emit('play')"
@pause="$emit('pause')"
/>
</span>
<div
v-if="type === 'html' && attachment.oembed"
class="oembed-container"
@click.prevent="linkClicked"
>
<div
v-if="attachment.thumb_url"
class="image"
>
<img :src="attachment.thumb_url">
</div>
<div class="text">
<!-- eslint-disable vue/no-v-html -->
<h1><a :href="attachment.url">{{ attachment.oembed.title }}</a></h1>
<div v-html="attachment.oembed.oembedHTML" />
<!-- eslint-enable vue/no-v-html -->
</div>
</div> </div>
<span
v-if="type === 'flash' && !hidden"
class="flash-container"
:href="attachment.url"
@click.stop.prevent="openModal"
>
<Flash
ref="flash"
class="flash"
:src="attachment.large_thumb_url || attachment.url"
@playerOpened="setFlashLoaded(true)"
@playerClosed="setFlashLoaded(false)"
/>
</span>
</div>
<div
v-if="size !== 'hide' && !hideDescription && (edit || (localDescription && showDescription))"
class="description-container"
:class="{ '-static': !edit }"
>
<input
v-if="edit"
v-model="localDescription"
type="text"
class="description-field"
:placeholder="$t('post_status.media_description')"
@keydown.enter.prevent=""
>
<p v-else>
{{ localDescription }}
</p>
</div> </div>
</div> </div>
</template> </template>
<script src="./attachment.js"></script> <script src="./attachment.js"></script>
<style lang="scss"> <style src="./attachment.scss" lang="scss"></style>
@import '../../_variables.scss';
.attachments {
display: flex;
flex-wrap: wrap;
.non-gallery {
max-width: 100%;
}
.placeholder {
display: inline-block;
padding: 0.3em 1em 0.3em 0;
color: $fallback--link;
color: var(--postLink, $fallback--link);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 100%;
}
.nsfw-placeholder {
cursor: pointer;
&.loading {
cursor: progress;
}
}
.attachment {
position: relative;
margin-top: 0.5em;
align-self: flex-start;
line-height: 0;
border-style: solid;
border-width: 1px;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
overflow: hidden;
}
.non-gallery.attachment {
&.video {
flex: 1 0 40%;
}
.nsfw {
height: 260px;
}
.small {
height: 120px;
flex-grow: 0;
}
.video {
height: 260px;
display: flex;
}
video {
max-height: 100%;
object-fit: contain;
}
}
.fullwidth {
flex-basis: 100%;
}
// fixes small gap below video
&.video {
line-height: 0;
}
.video-container {
display: flex;
max-height: 100%;
}
.video {
width: 100%;
height: 100%;
}
.play-icon {
position: absolute;
font-size: 64px;
top: calc(50% - 32px);
left: calc(50% - 32px);
color: rgba(255, 255, 255, 0.75);
text-shadow: 0 0 2px rgba(0, 0, 0, 0.4);
}
.play-icon::before {
margin: 0;
}
&.html {
flex-basis: 90%;
width: 100%;
display: flex;
}
.hider {
position: absolute;
right: 0;
white-space: nowrap;
margin: 10px;
padding: 5px;
background: rgba(230,230,230,0.6);
font-weight: bold;
z-index: 4;
line-height: 1;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
}
video {
z-index: 0;
}
audio {
width: 100%;
}
img.media-upload {
line-height: 0;
max-height: 200px;
max-width: 100%;
}
.oembed {
line-height: 1.2em;
flex: 1 0 100%;
width: 100%;
margin-right: 15px;
display: flex;
img {
width: 100%;
}
.image {
flex: 1;
img {
border: 0px;
border-radius: 5px;
height: 100%;
object-fit: cover;
}
}
.text {
flex: 2;
margin: 8px;
word-break: break-all;
h1 {
font-size: 14px;
margin: 0px;
}
}
}
.image-attachment {
&,
& .image {
width: 100%;
height: 100%;
}
&.hidden {
display: none;
}
.nsfw {
object-fit: cover;
width: 100%;
height: 100%;
}
img {
image-orientation: from-image; // NOTE: only FF supports this
}
}
}
</style>

View file

@ -1,3 +1,4 @@
import { h, resolveComponent } from 'vue'
import LoginForm from '../login_form/login_form.vue' import LoginForm from '../login_form/login_form.vue'
import MFARecoveryForm from '../mfa_form/recovery_form.vue' import MFARecoveryForm from '../mfa_form/recovery_form.vue'
import MFATOTPForm from '../mfa_form/totp_form.vue' import MFATOTPForm from '../mfa_form/totp_form.vue'
@ -5,8 +6,8 @@ import { mapGetters } from 'vuex'
const AuthForm = { const AuthForm = {
name: 'AuthForm', name: 'AuthForm',
render (createElement) { render () {
return createElement('component', { is: this.authForm }) return h(resolveComponent(this.authForm))
}, },
computed: { computed: {
authForm () { authForm () {

View file

@ -1,5 +1,6 @@
import UserCard from '../user_card/user_card.vue' import UserCard from '../user_card/user_card.vue'
import UserAvatar from '../user_avatar/user_avatar.vue' import UserAvatar from '../user_avatar/user_avatar.vue'
import RichContent from 'src/components/rich_content/rich_content.jsx'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
const BasicUserCard = { const BasicUserCard = {
@ -13,7 +14,8 @@ const BasicUserCard = {
}, },
components: { components: {
UserCard, UserCard,
UserAvatar UserAvatar,
RichContent
}, },
methods: { methods: {
toggleUserExpanded () { toggleUserExpanded () {

View file

@ -4,7 +4,7 @@
<UserAvatar <UserAvatar
class="avatar" class="avatar"
:user="user" :user="user"
@click.prevent.native="toggleUserExpanded" @click.prevent="toggleUserExpanded"
/> />
</router-link> </router-link>
<div <div
@ -25,24 +25,18 @@
:title="user.name" :title="user.name"
class="basic-user-card-user-name" class="basic-user-card-user-name"
> >
<!-- eslint-disable vue/no-v-html --> <RichContent
<span
v-if="user.name_html"
class="basic-user-card-user-name-value" class="basic-user-card-user-name-value"
v-html="user.name_html" :html="user.name"
:emoji="user.emoji"
/> />
<!-- eslint-enable vue/no-v-html -->
<span
v-else
class="basic-user-card-user-name-value"
>{{ user.name }}</span>
</div> </div>
<div> <div>
<router-link <router-link
class="basic-user-card-screen-name" class="basic-user-card-screen-name"
:to="userProfileLink(user)" :to="userProfileLink(user)"
> >
@{{ user.screen_name }} @{{ user.screen_name_ui }}
</router-link> </router-link>
</div> </div>
<slot /> <slot />

View file

@ -3,7 +3,7 @@
<div class="block-card-content-container"> <div class="block-card-content-container">
<button <button
v-if="blocked" v-if="blocked"
class="btn btn-default" class="btn button-default"
:disabled="progress" :disabled="progress"
@click="unblockUser" @click="unblockUser"
> >
@ -16,7 +16,7 @@
</button> </button>
<button <button
v-else v-else
class="btn btn-default" class="btn button-default"
:disabled="progress" :disabled="progress"
@click="blockUser" @click="blockUser"
> >

View file

@ -9,7 +9,7 @@ const Bookmarks = {
components: { components: {
Timeline Timeline
}, },
destroyed () { unmounted () {
this.$store.commit('clearTimeline', { timeline: 'bookmarks' }) this.$store.commit('clearTimeline', { timeline: 'bookmarks' })
} }
} }

View file

@ -5,11 +5,25 @@ import ChatMessage from '../chat_message/chat_message.vue'
import PostStatusForm from '../post_status_form/post_status_form.vue' import PostStatusForm from '../post_status_form/post_status_form.vue'
import ChatTitle from '../chat_title/chat_title.vue' import ChatTitle from '../chat_title/chat_title.vue'
import chatService from '../../services/chat_service/chat_service.js' import chatService from '../../services/chat_service/chat_service.js'
import { getScrollPosition, getNewTopPosition, isBottomedOut, scrollableContainerHeight } from './chat_layout_utils.js' import { promiseInterval } from '../../services/promise_interval/promise_interval.js'
import { getScrollPosition, getNewTopPosition, isBottomedOut, scrollableContainerHeight, isScrollable } from './chat_layout_utils.js'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faChevronDown,
faChevronLeft
} from '@fortawesome/free-solid-svg-icons'
import { buildFakeMessage } from '../../services/chat_utils/chat_utils.js'
library.add(
faChevronDown,
faChevronLeft
)
const BOTTOMED_OUT_OFFSET = 10 const BOTTOMED_OUT_OFFSET = 10
const JUMP_TO_BOTTOM_BUTTON_VISIBILITY_OFFSET = 150 const JUMP_TO_BOTTOM_BUTTON_VISIBILITY_OFFSET = 150
const SAFE_RESIZE_TIME_OFFSET = 100 const SAFE_RESIZE_TIME_OFFSET = 100
const MARK_AS_READ_DELAY = 1500
const MAX_RETRIES = 10
const Chat = { const Chat = {
components: { components: {
@ -23,7 +37,8 @@ const Chat = {
hoveredMessageChainId: undefined, hoveredMessageChainId: undefined,
lastScrollPosition: {}, lastScrollPosition: {},
scrollableContainerHeight: '100%', scrollableContainerHeight: '100%',
errorLoadingChat: false errorLoadingChat: false,
messageRetriers: {}
} }
}, },
created () { created () {
@ -42,7 +57,7 @@ const Chat = {
}) })
this.setChatLayout() this.setChatLayout()
}, },
destroyed () { unmounted () {
window.removeEventListener('scroll', this.handleScroll) window.removeEventListener('scroll', this.handleScroll)
window.removeEventListener('resize', this.handleLayoutChange) window.removeEventListener('resize', this.handleLayoutChange)
this.unsetChatLayout() this.unsetChatLayout()
@ -58,7 +73,7 @@ const Chat = {
}, },
formPlaceholder () { formPlaceholder () {
if (this.recipient) { if (this.recipient) {
return this.$t('chats.message_user', { nickname: this.recipient.screen_name }) return this.$t('chats.message_user', { nickname: this.recipient.screen_name_ui })
} else { } else {
return '' return ''
} }
@ -93,7 +108,7 @@ const Chat = {
const bottomedOutBeforeUpdate = this.bottomedOut(BOTTOMED_OUT_OFFSET) const bottomedOutBeforeUpdate = this.bottomedOut(BOTTOMED_OUT_OFFSET)
this.$nextTick(() => { this.$nextTick(() => {
if (bottomedOutBeforeUpdate) { if (bottomedOutBeforeUpdate) {
this.scrollDown({ forceRead: !document.hidden }) this.scrollDown()
} }
}) })
}, },
@ -199,15 +214,18 @@ const Chat = {
this.$nextTick(() => { this.$nextTick(() => {
scrollable.scrollTo({ top: scrollable.scrollHeight, left: 0, behavior }) scrollable.scrollTo({ top: scrollable.scrollHeight, left: 0, behavior })
}) })
if (forceRead || this.newMessageCount > 0) { if (forceRead) {
this.readChat() this.readChat()
} }
}, },
readChat () { readChat () {
if (!(this.currentChatMessageService && this.currentChatMessageService.lastMessage)) { return } if (!(this.currentChatMessageService && this.currentChatMessageService.maxId)) { return }
if (document.hidden) { return } if (document.hidden) { return }
const lastReadId = this.currentChatMessageService.lastMessage.id const lastReadId = this.currentChatMessageService.maxId
this.$store.dispatch('readChat', { id: this.currentChat.id, lastReadId }) this.$store.dispatch('readChat', {
id: this.currentChat.id,
lastReadId
})
}, },
bottomedOut (offset) { bottomedOut (offset) {
return isBottomedOut(this.$refs.scrollable, offset) return isBottomedOut(this.$refs.scrollable, offset)
@ -216,6 +234,13 @@ const Chat = {
const scrollable = this.$refs.scrollable const scrollable = this.$refs.scrollable
return scrollable && scrollable.scrollTop <= 0 return scrollable && scrollable.scrollTop <= 0
}, },
cullOlderCheck () {
window.setTimeout(() => {
if (this.bottomedOut(JUMP_TO_BOTTOM_BUTTON_VISIBILITY_OFFSET)) {
this.$store.dispatch('cullOlderMessages', this.currentChatMessageService.chatId)
}
}, 5000)
},
handleScroll: _.throttle(function () { handleScroll: _.throttle(function () {
if (!this.currentChat) { return } if (!this.currentChat) { return }
@ -223,13 +248,20 @@ const Chat = {
this.fetchChat({ maxId: this.currentChatMessageService.minId }) this.fetchChat({ maxId: this.currentChatMessageService.minId })
} else if (this.bottomedOut(JUMP_TO_BOTTOM_BUTTON_VISIBILITY_OFFSET)) { } else if (this.bottomedOut(JUMP_TO_BOTTOM_BUTTON_VISIBILITY_OFFSET)) {
this.jumpToBottomButtonVisible = false this.jumpToBottomButtonVisible = false
this.cullOlderCheck()
if (this.newMessageCount > 0) { if (this.newMessageCount > 0) {
this.readChat() // Use a delay before marking as read to prevent situation where new messages
// arrive just as you're leaving the view and messages that you didn't actually
// get to see get marked as read.
window.setTimeout(() => {
// Don't mark as read if the element doesn't exist, user has left chat view
if (this.$el) this.readChat()
}, MARK_AS_READ_DELAY)
} }
} else { } else {
this.jumpToBottomButtonVisible = true this.jumpToBottomButtonVisible = true
} }
}, 100), }, 200),
handleScrollUp (positionBeforeLoading) { handleScrollUp (positionBeforeLoading) {
const positionAfterLoading = getScrollPosition(this.$refs.scrollable) const positionAfterLoading = getScrollPosition(this.$refs.scrollable)
this.$refs.scrollable.scrollTo({ this.$refs.scrollable.scrollTo({
@ -244,9 +276,9 @@ const Chat = {
const chatId = chatMessageService.chatId const chatId = chatMessageService.chatId
const fetchOlderMessages = !!maxId const fetchOlderMessages = !!maxId
const sinceId = fetchLatest && chatMessageService.lastMessage && chatMessageService.lastMessage.id const sinceId = fetchLatest && chatMessageService.maxId
this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId }) return this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId })
.then((messages) => { .then((messages) => {
// Clear the current chat in case we're recovering from a ws connection loss. // Clear the current chat in case we're recovering from a ws connection loss.
if (isFirstFetch) { if (isFirstFetch) {
@ -263,6 +295,14 @@ const Chat = {
if (isFirstFetch) { if (isFirstFetch) {
this.updateScrollableContainerHeight() this.updateScrollableContainerHeight()
} }
// In vertical screens, the first batch of fetched messages may not always take the
// full height of the scrollable container.
// If this is the case, we want to fetch the messages until the scrollable container
// is fully populated so that the user has the ability to scroll up and load the history.
if (!isScrollable(this.$refs.scrollable) && messages.length > 0) {
this.fetchChat({ maxId: this.currentChatMessageService.minId })
}
}) })
}) })
}) })
@ -287,42 +327,78 @@ const Chat = {
}, },
doStartFetching () { doStartFetching () {
this.$store.dispatch('startFetchingCurrentChat', { this.$store.dispatch('startFetchingCurrentChat', {
fetcher: () => setInterval(() => this.fetchChat({ fetchLatest: true }), 5000) fetcher: () => promiseInterval(() => this.fetchChat({ fetchLatest: true }), 5000)
}) })
this.fetchChat({ isFirstFetch: true }) this.fetchChat({ isFirstFetch: true })
}, },
sendMessage ({ status, media }) { handleAttachmentPosting () {
this.$nextTick(() => {
this.handleResize()
// When the posting form size changes because of a media attachment, we need an extra resize
// to account for the potential delay in the DOM update.
setTimeout(() => {
this.updateScrollableContainerHeight()
}, SAFE_RESIZE_TIME_OFFSET)
this.scrollDown({ forceRead: true })
})
},
sendMessage ({ status, media, idempotencyKey }) {
const params = { const params = {
id: this.currentChat.id, id: this.currentChat.id,
content: status content: status,
idempotencyKey
} }
if (media[0]) { if (media[0]) {
params.mediaId = media[0].id params.mediaId = media[0].id
} }
return this.backendInteractor.sendChatMessage(params) const fakeMessage = buildFakeMessage({
attachments: media,
chatId: this.currentChat.id,
content: status,
userId: this.currentUser.id,
idempotencyKey
})
this.$store.dispatch('addChatMessages', {
chatId: this.currentChat.id,
messages: [fakeMessage]
}).then(() => {
this.handleAttachmentPosting()
})
return this.doSendMessage({ params, fakeMessage, retriesLeft: MAX_RETRIES })
},
doSendMessage ({ params, fakeMessage, retriesLeft = MAX_RETRIES }) {
if (retriesLeft <= 0) return
this.backendInteractor.sendChatMessage(params)
.then(data => { .then(data => {
this.$store.dispatch('addChatMessages', { chatId: this.currentChat.id, messages: [data] }).then(() => { this.$store.dispatch('addChatMessages', {
this.$nextTick(() => { chatId: this.currentChat.id,
this.handleResize() updateMaxId: false,
// When the posting form size changes because of a media attachment, we need an extra resize messages: [{ ...data, fakeId: fakeMessage.id }]
// to account for the potential delay in the DOM update.
setTimeout(() => {
this.updateScrollableContainerHeight()
}, SAFE_RESIZE_TIME_OFFSET)
this.scrollDown({ forceRead: true })
})
}) })
return data return data
}) })
.catch(error => { .catch(error => {
console.error('Error sending message', error) console.error('Error sending message', error)
return { this.$store.dispatch('handleMessageError', {
error: this.$t('chats.error_sending_message') chatId: this.currentChat.id,
fakeId: fakeMessage.id,
isRetry: retriesLeft !== MAX_RETRIES
})
if ((error.statusCode >= 500 && error.statusCode < 600) || error.message === 'Failed to fetch') {
this.messageRetriers[fakeMessage.id] = setTimeout(() => {
this.doSendMessage({ params, fakeMessage, retriesLeft: retriesLeft - 1 })
}, 1000 * (2 ** (MAX_RETRIES - retriesLeft)))
} }
return {}
}) })
return Promise.resolve(fakeMessage)
}, },
goBack () { goBack () {
this.$router.push({ name: 'chats', params: { username: this.currentUser.screen_name } }) this.$router.push({ name: 'chats', params: { username: this.currentUser.screen_name } })

View file

@ -25,7 +25,7 @@
min-height: 100%; min-height: 100%;
margin: 0 0 0 0; margin: 0 0 0 0;
border-radius: 10px 10px 0 0; border-radius: 10px 10px 0 0;
border-radius: var(--panelRadius, 10px) var(--panelRadius, 10px) 0 0 ; border-radius: var(--panelRadius, 10px) var(--panelRadius, 10px) 0 0;
&::after { &::after {
border-radius: 0; border-radius: 0;
@ -58,12 +58,10 @@
.go-back-button { .go-back-button {
cursor: pointer; cursor: pointer;
margin-right: 1.4em; width: 28px;
text-align: center;
i { padding: 0.6em;
display: flex; margin: -0.6em 0.6em -0.6em -0.6em;
align-items: center;
}
} }
.jump-to-bottom-button { .jump-to-bottom-button {
@ -78,7 +76,7 @@
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.3), 0px 2px 4px rgba(0, 0, 0, 0.3); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
z-index: 10; z-index: 10;
transition: 0.35s all; transition: 0.35s all;
transition-timing-function: cubic-bezier(0, 1, 0.5, 1); transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
@ -100,10 +98,10 @@
.unread-message-count { .unread-message-count {
font-size: 0.8em; font-size: 0.8em;
left: 50%; left: 50%;
transform: translate(-50%, 0);
border-radius: 100%;
margin-top: -1rem; margin-top: -1rem;
padding: 0; padding: 0.1em;
border-radius: 50px;
position: absolute;
} }
.chat-loading-error { .chat-loading-error {
@ -140,11 +138,21 @@
} }
.chat-view-heading { .chat-view-heading {
box-sizing: border-box;
position: static; position: static;
z-index: 9999; z-index: 9999;
top: 0; top: 0;
margin-top: 0; margin-top: 0;
border-radius: 0; border-radius: 0;
/* This practically overlays the panel heading color over panel background
* color. This is needed because we allow transparent panel background and
* it doesn't work well in this "disjointed panel header" case
*/
background:
linear-gradient(to top, var(--panel), var(--panel)),
linear-gradient(to top, var(--bg), var(--bg));
height: 50px;
} }
.scrollable-message-list { .scrollable-message-list {

View file

@ -14,7 +14,10 @@
class="go-back-button" class="go-back-button"
@click="goBack" @click="goBack"
> >
<i class="button-icon icon-left-open" /> <FAIcon
size="lg"
icon="chevron-left"
/>
</a> </a>
<div class="title text-center"> <div class="title text-center">
<ChatTitle <ChatTitle
@ -23,71 +26,71 @@
/> />
</div> </div>
</div> </div>
<template> <div
<div ref="scrollable"
ref="scrollable" class="scrollable-message-list"
class="scrollable-message-list" :style="{ height: scrollableContainerHeight }"
:style="{ height: scrollableContainerHeight }" @scroll="handleScroll"
@scroll="handleScroll" >
> <template v-if="!errorLoadingChat">
<template v-if="!errorLoadingChat"> <ChatMessage
<ChatMessage v-for="chatViewItem in chatViewItems"
v-for="chatViewItem in chatViewItems" :key="chatViewItem.id"
:key="chatViewItem.id" :author="recipient"
:author="recipient" :chat-view-item="chatViewItem"
:chat-view-item="chatViewItem" :hovered-message-chain="chatViewItem.messageChainId === hoveredMessageChainId"
:hovered-message-chain="chatViewItem.messageChainId === hoveredMessageChainId" @hover="onMessageHover"
@hover="onMessageHover"
/>
</template>
<div
v-else
class="chat-loading-error"
>
<div class="alert error">
{{ $t('chats.error_loading_chat') }}
</div>
</div>
</div>
<div
ref="footer"
class="panel-body footer"
>
<div
class="jump-to-bottom-button"
:class="{ 'visible': jumpToBottomButtonVisible }"
@click="scrollDown({ behavior: 'smooth' })"
>
<i class="icon-down-open">
<div
v-if="newMessageCount"
class="badge badge-notification unread-chat-count unread-message-count"
>
{{ newMessageCount }}
</div>
</i>
</div>
<PostStatusForm
:disable-subject="true"
:disable-scope-selector="true"
:disable-notice="true"
:disable-lock-warning="true"
:disable-polls="true"
:disable-sensitivity-checkbox="true"
:disable-submit="errorLoadingChat || !currentChat"
:disable-preview="true"
:post-handler="sendMessage"
:submit-on-enter="!mobileLayout"
:preserve-focus="!mobileLayout"
:auto-focus="!mobileLayout"
:placeholder="formPlaceholder"
:file-limit="1"
max-height="160"
emoji-picker-placement="top"
@resize="handleResize"
/> />
</template>
<div
v-else
class="chat-loading-error"
>
<div class="alert error">
{{ $t('chats.error_loading_chat') }}
</div>
</div> </div>
</template> </div>
<div
ref="footer"
class="panel-body footer"
>
<div
class="jump-to-bottom-button"
:class="{ 'visible': jumpToBottomButtonVisible }"
@click="scrollDown({ behavior: 'smooth' })"
>
<span>
<FAIcon icon="chevron-down" />
<div
v-if="newMessageCount"
class="badge badge-notification unread-chat-count unread-message-count"
>
{{ newMessageCount }}
</div>
</span>
</div>
<PostStatusForm
:disable-subject="true"
:disable-scope-selector="true"
:disable-notice="true"
:disable-lock-warning="true"
:disable-polls="true"
:disable-sensitivity-checkbox="true"
:disable-submit="errorLoadingChat || !currentChat"
:disable-preview="true"
:optimistic-posting="true"
:post-handler="sendMessage"
:submit-on-enter="!mobileLayout"
:preserve-focus="!mobileLayout"
:auto-focus="!mobileLayout"
:placeholder="formPlaceholder"
:file-limit="1"
max-height="160"
emoji-picker-placement="top"
@resize="handleResize"
/>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -24,3 +24,10 @@ export const isBottomedOut = (el, offset = 0) => {
export const scrollableContainerHeight = (inner, header, footer) => { export const scrollableContainerHeight = (inner, header, footer) => {
return inner.offsetHeight - header.clientHeight - footer.clientHeight return inner.offsetHeight - header.clientHeight - footer.clientHeight
} }
// Returns whether or not the scrollbar is visible.
export const isScrollable = (el) => {
if (!el) return
return el.scrollHeight > el.clientHeight
}

View file

@ -10,7 +10,10 @@
<span class="title"> <span class="title">
{{ $t("chats.chats") }} {{ $t("chats.chats") }}
</span> </span>
<button @click="newChat"> <button
class="button-default"
@click="newChat"
>
{{ $t("chats.new") }} {{ $t("chats.new") }}
</button> </button>
</div> </div>
@ -20,10 +23,7 @@
class="timeline" class="timeline"
> >
<List :items="sortedChatList"> <List :items="sortedChatList">
<template <template v-slot:item="{item}">
slot="item"
slot-scope="{item}"
>
<ChatListItem <ChatListItem
:key="item.id" :key="item.id"
:compact="false" :compact="false"

View file

@ -1,5 +1,5 @@
import { mapState } from 'vuex' import { mapState } from 'vuex'
import StatusContent from '../status_content/status_content.vue' import StatusBody from '../status_content/status_content.vue'
import fileType from 'src/services/file_type/file_type.service' import fileType from 'src/services/file_type/file_type.service'
import UserAvatar from '../user_avatar/user_avatar.vue' import UserAvatar from '../user_avatar/user_avatar.vue'
import AvatarList from '../avatar_list/avatar_list.vue' import AvatarList from '../avatar_list/avatar_list.vue'
@ -16,7 +16,7 @@ const ChatListItem = {
AvatarList, AvatarList,
Timeago, Timeago,
ChatTitle, ChatTitle,
StatusContent StatusBody
}, },
computed: { computed: {
...mapState({ ...mapState({
@ -38,12 +38,14 @@ const ChatListItem = {
}, },
messageForStatusContent () { messageForStatusContent () {
const message = this.chat.lastMessage const message = this.chat.lastMessage
const messageEmojis = message ? message.emojis : []
const isYou = message && message.account_id === this.currentUser.id const isYou = message && message.account_id === this.currentUser.id
const content = message ? (this.attachmentInfo || message.content) : '' const content = message ? (this.attachmentInfo || message.content) : ''
const messagePreview = isYou ? `<i>${this.$t('chats.you')}</i> ${content}` : content const messagePreview = isYou ? `<i>${this.$t('chats.you')}</i> ${content}` : content
return { return {
summary: '', summary: '',
statusnet_html: messagePreview, emojis: messageEmojis,
raw_html: messagePreview,
text: messagePreview, text: messagePreview,
attachments: [] attachments: []
} }

View file

@ -77,18 +77,15 @@
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius); border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
} }
.StatusContent { .chat-preview-body {
img.emoji { --emoji-size: 1.4em;
width: 1.4em;
height: 1.4em;
}
} }
.time-wrapper { .time-wrapper {
line-height: 1.4em; line-height: 1.4em;
} }
.single-line { .chat-preview-body {
padding-right: 1em; padding-right: 1em;
} }
} }

View file

@ -21,9 +21,16 @@
/> />
</span> </span>
<span class="heading-right" /> <span class="heading-right" />
<div class="time-wrapper">
<Timeago
:time="chat.updated_at"
:auto-update="60"
/>
</div>
</div> </div>
<div class="chat-preview"> <div class="chat-preview">
<StatusContent <StatusBody
class="chat-preview-body"
:status="messageForStatusContent" :status="messageForStatusContent"
:single-line="true" :single-line="true"
/> />
@ -35,12 +42,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="time-wrapper">
<Timeago
:time="chat.updated_at"
:auto-update="60"
/>
</div>
</div> </div>
</template> </template>

View file

@ -7,6 +7,16 @@ import LinkPreview from '../link-preview/link-preview.vue'
import StatusContent from '../status_content/status_content.vue' import StatusContent from '../status_content/status_content.vue'
import ChatMessageDate from '../chat_message_date/chat_message_date.vue' import ChatMessageDate from '../chat_message_date/chat_message_date.vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faTimes,
faEllipsisH
} from '@fortawesome/free-solid-svg-icons'
library.add(
faTimes,
faEllipsisH
)
const ChatMessage = { const ChatMessage = {
name: 'ChatMessage', name: 'ChatMessage',
@ -17,6 +27,7 @@ const ChatMessage = {
'chatViewItem', 'chatViewItem',
'hoveredMessageChain' 'hoveredMessageChain'
], ],
emits: ['hover'],
components: { components: {
Popover, Popover,
Attachment, Attachment,
@ -47,8 +58,9 @@ const ChatMessage = {
messageForStatusContent () { messageForStatusContent () {
return { return {
summary: '', summary: '',
statusnet_html: this.message.content, emojis: this.message.emojis,
text: this.message.content, raw_html: this.message.content || '',
text: this.message.content || '',
attachments: this.message.attachments attachments: this.message.attachments
} }
}, },

View file

@ -1,6 +1,7 @@
@import '../../_variables.scss'; @import '../../_variables.scss';
.chat-message-wrapper { .chat-message-wrapper {
&.hovered-message-chain { &.hovered-message-chain {
.animated.Avatar { .animated.Avatar {
canvas { canvas {
@ -24,16 +25,13 @@
} }
} }
.icon-ellipsis { .menu-icon {
cursor: pointer; cursor: pointer;
&:hover, .extra-button-popover.open & { &:hover, .extra-button-popover.open & {
color: $fallback--text; color: $fallback--text;
color: var(--text, $fallback--text); color: var(--text, $fallback--text);
} }
border-radius: $fallback--chatMessageRadius;
border-radius: var(--chatMessageRadius, $fallback--chatMessageRadius);
} }
.popover { .popover {
@ -43,6 +41,12 @@
.chat-message { .chat-message {
display: flex; display: flex;
padding-bottom: 0.5em; padding-bottom: 0.5em;
.status-body:hover {
--_still-image-img-visibility: visible;
--_still-image-canvas-visibility: hidden;
--_still-image-label-visibility: hidden;
}
} }
.avatar-wrapper { .avatar-wrapper {
@ -65,10 +69,6 @@
&.with-media { &.with-media {
width: 100%; width: 100%;
.gallery-row {
overflow: hidden;
}
.status { .status {
width: 100%; width: 100%;
} }
@ -92,8 +92,9 @@
} }
.without-attachment { .without-attachment {
.status-content { .message-content {
&::after { // TODO figure out how to do it properly
.RichContent::after {
margin-right: 5.4em; margin-right: 5.4em;
content: " "; content: " ";
display: inline-block; display: inline-block;
@ -101,6 +102,19 @@
} }
} }
.pending {
.status-content.media-body, .created-at {
color: var(--faint);
}
}
.error {
.status-content.media-body, .created-at {
color: $fallback--cRed;
color: var(--badgeNotification, $fallback--cRed);
}
}
.incoming { .incoming {
a { a {
color: var(--chatMessageIncomingLink, $fallback--link); color: var(--chatMessageIncomingLink, $fallback--link);
@ -152,6 +166,7 @@
.visible { .visible {
opacity: 1; opacity: 1;
} }
} }
.chat-message-date-separator { .chat-message-date-separator {

View file

@ -32,7 +32,7 @@
> >
<div <div
class="media status" class="media status"
:class="{ 'without-attachment': !hasAttachment }" :class="{ 'without-attachment': !hasAttachment, 'pending': chatViewItem.data.pending, 'error': chatViewItem.data.error }"
style="position: relative" style="position: relative"
@mouseenter="hovered = true" @mouseenter="hovered = true"
@mouseleave="hovered = false" @mouseleave="hovered = false"
@ -50,34 +50,38 @@
@show="menuOpened = true" @show="menuOpened = true"
@close="menuOpened = false" @close="menuOpened = false"
> >
<div slot="content"> <template v-slot:content>
<div class="dropdown-menu"> <div class="dropdown-menu">
<button <button
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click="deleteMessage" @click="deleteMessage"
> >
<i class="icon-cancel" /> {{ $t("chats.delete") }} <FAIcon icon="times" /> {{ $t("chats.delete") }}
</button> </button>
</div> </div>
</div> </template>
<button <template v-slot:trigger>
slot="trigger" <button
:title="$t('chats.more')" class="button-default menu-icon"
> :title="$t('chats.more')"
<i class="icon-ellipsis" /> >
</button> <FAIcon icon="ellipsis-h" />
</button>
</template>
</Popover> </Popover>
</div> </div>
<StatusContent <StatusContent
class="message-content"
:status="messageForStatusContent" :status="messageForStatusContent"
:full-content="true" :full-content="true"
> >
<span <template v-slot:footer>
slot="footer" <span
class="created-at" class="created-at"
> >
{{ createdAt }} {{ createdAt }}
</span> </span>
</template>
</StatusContent> </StatusContent>
</div> </div>
</div> </div>

View file

@ -5,6 +5,8 @@
</template> </template>
<script> <script>
import localeService from 'src/services/locale/locale.service.js'
export default { export default {
name: 'Timeago', name: 'Timeago',
props: ['date'], props: ['date'],
@ -16,7 +18,7 @@ export default {
if (this.date.getTime() === today.getTime()) { if (this.date.getTime() === today.getTime()) {
return this.$t('display_date.today') return this.$t('display_date.today')
} else { } else {
return this.date.toLocaleDateString('en', { day: 'numeric', month: 'long' }) return this.date.toLocaleDateString(localeService.internalToBrowserLocale(this.$i18n.locale), { day: 'numeric', month: 'long' })
} }
} }
} }

View file

@ -1,6 +1,16 @@
import { mapState, mapGetters } from 'vuex' import { mapState, mapGetters } from 'vuex'
import BasicUserCard from '../basic_user_card/basic_user_card.vue' import BasicUserCard from '../basic_user_card/basic_user_card.vue'
import UserAvatar from '../user_avatar/user_avatar.vue' import UserAvatar from '../user_avatar/user_avatar.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faSearch,
faChevronLeft
} from '@fortawesome/free-solid-svg-icons'
library.add(
faSearch,
faChevronLeft
)
const chatNew = { const chatNew = {
components: { components: {

View file

@ -8,9 +8,7 @@
} }
} }
.icon-search { .search-icon {
font-size: 1.5em;
float: right;
margin-right: 0.3em; margin-right: 0.3em;
} }
@ -25,5 +23,9 @@
.go-back-button { .go-back-button {
cursor: pointer; cursor: pointer;
width: 28px;
text-align: center;
padding: 0.6em;
margin: -0.6em 0.6em -0.6em -0.6em;
} }
} }

View file

@ -11,12 +11,18 @@
class="go-back-button" class="go-back-button"
@click="goBack" @click="goBack"
> >
<i class="button-icon icon-left-open" /> <FAIcon
size="lg"
icon="chevron-left"
/>
</a> </a>
</div> </div>
<div class="input-wrap"> <div class="input-wrap">
<div class="input-search"> <div class="input-search">
<i class="button-icon icon-search" /> <FAIcon
class="search-icon fa-scale-110 fa-old-padding"
icon="search"
/>
</div> </div>
<input <input
ref="search" ref="search"

View file

@ -1,31 +0,0 @@
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
const chatPanel = {
props: [ 'floating' ],
data () {
return {
currentMessage: '',
channel: null,
collapsed: true
}
},
computed: {
messages () {
return this.$store.state.chat.messages
}
},
methods: {
submit (message) {
this.$store.state.chat.channel.push('new_msg', { text: message }, 10000)
this.currentMessage = ''
},
togglePanel () {
this.collapsed = !this.collapsed
},
userProfileLink (user) {
return generateProfileLink(user.id, user.username, this.$store.state.instance.restrictedNicknames)
}
}
}
export default chatPanel

View file

@ -1,18 +1,19 @@
import Vue from 'vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import UserAvatar from '../user_avatar/user_avatar.vue' import UserAvatar from '../user_avatar/user_avatar.vue'
import RichContent from 'src/components/rich_content/rich_content.jsx'
export default Vue.component('chat-title', { export default {
name: 'ChatTitle', name: 'ChatTitle',
components: { components: {
UserAvatar UserAvatar,
RichContent
}, },
props: [ props: [
'user', 'withAvatar' 'user', 'withAvatar'
], ],
computed: { computed: {
title () { title () {
return this.user ? this.user.screen_name : '' return this.user ? this.user.screen_name_ui : ''
}, },
htmlTitle () { htmlTitle () {
return this.user ? this.user.name_html : '' return this.user ? this.user.name_html : ''
@ -23,4 +24,4 @@ export default Vue.component('chat-title', {
return generateProfileLink(user.id, user.screen_name) return generateProfileLink(user.id, user.screen_name)
} }
} }
}) }

View file

@ -1,5 +1,4 @@
<template> <template>
<!-- eslint-disable vue/no-v-html -->
<div <div
class="chat-title" class="chat-title"
:title="title" :title="title"
@ -14,12 +13,14 @@
height="23px" height="23px"
/> />
</router-link> </router-link>
<span <RichContent
v-if="user"
class="username" class="username"
v-html="htmlTitle" :title="'@'+user.screen_name_ui"
:html="htmlTitle"
:emoji="user.emoji || []"
/> />
</div> </div>
<!-- eslint-enable vue/no-v-html -->
</template> </template>
<script src="./chat_title.js"></script> <script src="./chat_title.js"></script>
@ -34,6 +35,8 @@
white-space: nowrap; white-space: nowrap;
align-items: center; align-items: center;
--emoji-size: 14px;
.username { .username {
max-width: 100%; max-width: 100%;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -41,14 +44,6 @@
display: inline; display: inline;
word-wrap: break-word; word-wrap: break-word;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis;
.emoji {
width: 14px;
height: 14px;
vertical-align: middle;
object-fit: contain
}
} }
.Avatar { .Avatar {

View file

@ -6,9 +6,9 @@
<input <input
type="checkbox" type="checkbox"
:disabled="disabled" :disabled="disabled"
:checked="checked" :checked="modelValue"
:indeterminate.prop="indeterminate" :indeterminate="indeterminate"
@change="$emit('change', $event.target.checked)" @change="$emit('update:modelValue', $event.target.checked)"
> >
<i class="checkbox-indicator" /> <i class="checkbox-indicator" />
<span <span
@ -22,12 +22,9 @@
<script> <script>
export default { export default {
model: { emits: ['update:modelValue'],
prop: 'checked',
event: 'change'
},
props: [ props: [
'checked', 'modelValue',
'indeterminate', 'indeterminate',
'disabled' 'disabled'
] ]

View file

@ -11,28 +11,28 @@
</label> </label>
<Checkbox <Checkbox
v-if="typeof fallback !== 'undefined' && showOptionalTickbox" v-if="typeof fallback !== 'undefined' && showOptionalTickbox"
:checked="present" :model-value="present"
:disabled="disabled" :disabled="disabled"
class="opt" class="opt"
@change="$emit('input', typeof value === 'undefined' ? fallback : undefined)" @update:modelValue="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)"
/> />
<div class="input color-input-field"> <div class="input color-input-field">
<input <input
:id="name + '-t'" :id="name + '-t'"
class="textColor unstyled" class="textColor unstyled"
type="text" type="text"
:value="value || fallback" :value="modelValue || fallback"
:disabled="!present || disabled" :disabled="!present || disabled"
@input="$emit('input', $event.target.value)" @input="$emit('update:modelValue', $event.target.value)"
> >
<input <input
v-if="validColor" v-if="validColor"
:id="name" :id="name"
class="nativeColor unstyled" class="nativeColor unstyled"
type="color" type="color"
:value="value || fallback" :value="modelValue || fallback"
:disabled="!present || disabled" :disabled="!present || disabled"
@input="$emit('input', $event.target.value)" @input="$emit('update:modelValue', $event.target.value)"
> >
<div <div
v-if="transparentColor" v-if="transparentColor"
@ -67,7 +67,7 @@ export default {
}, },
// Color value, should be required but vue cannot tell the difference // Color value, should be required but vue cannot tell the difference
// between "property missing" and "property set to undefined" // between "property missing" and "property set to undefined"
value: { modelValue: {
required: false, required: false,
type: String, type: String,
default: undefined default: undefined
@ -91,18 +91,19 @@ export default {
default: true default: true
} }
}, },
emits: ['update:modelValue'],
computed: { computed: {
present () { present () {
return typeof this.value !== 'undefined' return typeof this.modelValue !== 'undefined'
}, },
validColor () { validColor () {
return hex2rgb(this.value || this.fallback) return hex2rgb(this.modelValue || this.fallback)
}, },
transparentColor () { transparentColor () {
return this.value === 'transparent' return this.modelValue === 'transparent'
}, },
computedColor () { computedColor () {
return this.value && this.value.startsWith('--') return this.modelValue && this.modelValue.startsWith('--')
} }
} }
} }

View file

@ -8,13 +8,13 @@
class="rating" class="rating"
> >
<span v-if="contrast.aaa"> <span v-if="contrast.aaa">
<i class="icon-thumbs-up-alt" /> <FAIcon icon="thumbs-up" />
</span> </span>
<span v-if="!contrast.aaa && contrast.aa"> <span v-if="!contrast.aaa && contrast.aa">
<i class="icon-adjust" /> <FAIcon icon="adjust" />
</span> </span>
<span v-if="!contrast.aaa && !contrast.aa"> <span v-if="!contrast.aaa && !contrast.aa">
<i class="icon-attention" /> <FAIcon icon="exclamation-triangle" />
</span> </span>
</span> </span>
<span <span
@ -23,29 +23,45 @@
:title="hint_18pt" :title="hint_18pt"
> >
<span v-if="contrast.laaa"> <span v-if="contrast.laaa">
<i class="icon-thumbs-up-alt" /> <FAIcon icon="thumbs-up" />
</span> </span>
<span v-if="!contrast.laaa && contrast.laa"> <span v-if="!contrast.laaa && contrast.laa">
<i class="icon-adjust" /> <FAIcon icon="adjust" />
</span> </span>
<span v-if="!contrast.laaa && !contrast.laa"> <span v-if="!contrast.laaa && !contrast.laa">
<i class="icon-attention" /> <FAIcon icon="exclamation-triangle" />
</span> </span>
</span> </span>
</span> </span>
</template> </template>
<script> <script>
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faAdjust,
faExclamationTriangle,
faThumbsUp
} from '@fortawesome/free-solid-svg-icons'
library.add(
faAdjust,
faExclamationTriangle,
faThumbsUp
)
export default { export default {
props: { props: {
large: { large: {
required: false required: false,
type: Boolean,
default: false
}, },
// TODO: Make theme switcher compute theme initially so that contrast // TODO: Make theme switcher compute theme initially so that contrast
// component won't be called without contrast data // component won't be called without contrast data
contrast: { contrast: {
required: false, required: false,
type: Object type: Object,
default: () => ({})
} }
}, },
computed: { computed: {
@ -82,6 +98,7 @@ export default {
.rating { .rating {
display: inline-block; display: inline-block;
text-align: center; text-align: center;
margin-left: 0.5em;
} }
} }
</style> </style>

View file

@ -1,5 +1,19 @@
import { reduce, filter, findIndex, clone, get } from 'lodash' import { reduce, filter, findIndex, clone, get } from 'lodash'
import Status from '../status/status.vue' import Status from '../status/status.vue'
import ThreadTree from '../thread_tree/thread_tree.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faAngleDoubleDown,
faAngleDoubleLeft,
faChevronLeft
} from '@fortawesome/free-solid-svg-icons'
library.add(
faAngleDoubleDown,
faAngleDoubleLeft,
faChevronLeft
)
const sortById = (a, b) => { const sortById = (a, b) => {
const idA = a.type === 'retweet' ? a.retweeted_status.id : a.id const idA = a.type === 'retweet' ? a.retweeted_status.id : a.id
@ -35,7 +49,10 @@ const conversation = {
data () { data () {
return { return {
highlight: null, highlight: null,
expanded: false expanded: false,
threadDisplayStatusObject: {}, // id => 'showing' | 'hidden'
statusContentPropertiesObject: {},
inlineDivePosition: null
} }
}, },
props: [ props: [
@ -44,7 +61,8 @@ const conversation = {
'isPage', 'isPage',
'pinnedStatusIdsObject', 'pinnedStatusIdsObject',
'inProfile', 'inProfile',
'profileUserId' 'profileUserId',
'virtualHidden'
], ],
created () { created () {
if (this.isPage) { if (this.isPage) {
@ -52,6 +70,51 @@ const conversation = {
} }
}, },
computed: { computed: {
maxDepthToShowByDefault () {
// maxDepthInThread = max number of depths that is *visible*
// since our depth starts with 0 and "showing" means "showing children"
// there is a -2 here
const maxDepth = this.$store.getters.mergedConfig.maxDepthInThread - 2
return maxDepth >= 1 ? maxDepth : 1
},
displayStyle () {
return this.$store.getters.mergedConfig.conversationDisplay
},
isTreeView () {
return !this.isLinearView
},
treeViewIsSimple () {
return !this.$store.getters.mergedConfig.conversationTreeAdvanced
},
isLinearView () {
return this.displayStyle === 'linear'
},
shouldFadeAncestors () {
return this.$store.getters.mergedConfig.conversationTreeFadeAncestors
},
otherRepliesButtonPosition () {
return this.$store.getters.mergedConfig.conversationOtherRepliesButton
},
showOtherRepliesButtonBelowStatus () {
return this.otherRepliesButtonPosition === 'below'
},
showOtherRepliesButtonInsideStatus () {
return this.otherRepliesButtonPosition === 'inside'
},
suspendable () {
if (this.isTreeView) {
return Object.entries(this.statusContentProperties)
.every(([k, prop]) => !prop.replying && prop.mediaPlaying.length === 0)
}
if (this.$refs.statusComponent && this.$refs.statusComponent[0]) {
return this.$refs.statusComponent.every(s => s.suspendable)
} else {
return true
}
},
hideStatus () {
return this.virtualHidden && this.suspendable
},
status () { status () {
return this.$store.state.statuses.allStatusesObject[this.statusId] return this.$store.state.statuses.allStatusesObject[this.statusId]
}, },
@ -82,6 +145,121 @@ const conversation = {
return sortAndFilterConversation(conversation, this.status) return sortAndFilterConversation(conversation, this.status)
}, },
statusMap () {
return this.conversation.reduce((res, s) => {
res[s.id] = s
return res
}, {})
},
threadTree () {
const reverseLookupTable = this.conversation.reduce((table, status, index) => {
table[status.id] = index
return table
}, {})
const threads = this.conversation.reduce((a, cur) => {
const id = cur.id
a.forest[id] = this.getReplies(id)
.map(s => s.id)
return a
}, {
forest: {}
})
const walk = (forest, topLevel, depth = 0, processed = {}) => topLevel.map(id => {
if (processed[id]) {
return []
}
processed[id] = true
return [{
status: this.conversation[reverseLookupTable[id]],
id,
depth
}, walk(forest, forest[id], depth + 1, processed)].reduce((a, b) => a.concat(b), [])
}).reduce((a, b) => a.concat(b), [])
const linearized = walk(threads.forest, this.topLevel.map(k => k.id))
return linearized
},
replyIds () {
return this.conversation.map(k => k.id)
.reduce((res, id) => {
res[id] = (this.replies[id] || []).map(k => k.id)
return res
}, {})
},
totalReplyCount () {
const sizes = {}
const subTreeSizeFor = (id) => {
if (sizes[id]) {
return sizes[id]
}
sizes[id] = 1 + this.replyIds[id].map(cid => subTreeSizeFor(cid)).reduce((a, b) => a + b, 0)
return sizes[id]
}
this.conversation.map(k => k.id).map(subTreeSizeFor)
return Object.keys(sizes).reduce((res, id) => {
res[id] = sizes[id] - 1 // exclude itself
return res
}, {})
},
totalReplyDepth () {
const depths = {}
const subTreeDepthFor = (id) => {
if (depths[id]) {
return depths[id]
}
depths[id] = 1 + this.replyIds[id].map(cid => subTreeDepthFor(cid)).reduce((a, b) => a > b ? a : b, 0)
return depths[id]
}
this.conversation.map(k => k.id).map(subTreeDepthFor)
return Object.keys(depths).reduce((res, id) => {
res[id] = depths[id] - 1 // exclude itself
return res
}, {})
},
depths () {
return this.threadTree.reduce((a, k) => {
a[k.id] = k.depth
return a
}, {})
},
topLevel () {
const topLevel = this.conversation.reduce((tl, cur) =>
tl.filter(k => this.getReplies(cur.id).map(v => v.id).indexOf(k.id) === -1), this.conversation)
return topLevel
},
otherTopLevelCount () {
return this.topLevel.length - 1
},
showingTopLevel () {
if (this.canDive && this.diveRoot) {
return [this.statusMap[this.diveRoot]]
}
return this.topLevel
},
diveRoot () {
const statusId = this.inlineDivePosition || this.statusId
const isTopLevel = !this.parentOf(statusId)
return isTopLevel ? null : statusId
},
diveDepth () {
return this.canDive && this.diveRoot ? this.depths[this.diveRoot] : 0
},
diveMode () {
return this.canDive && !!this.diveRoot
},
shouldShowAllConversationButton () {
// The "show all conversation" button tells the user that there exist
// other toplevel statuses, so do not show it if there is only a single root
return this.isTreeView && this.isExpanded && this.diveMode && this.topLevel.length > 1
},
shouldShowAncestors () {
return this.isTreeView && this.isExpanded && this.ancestorsOf(this.diveRoot).length
},
replies () { replies () {
let i = 1 let i = 1
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
@ -101,11 +279,71 @@ const conversation = {
}, {}) }, {})
}, },
isExpanded () { isExpanded () {
return this.expanded || this.isPage return !!(this.expanded || this.isPage)
},
hiddenStyle () {
const height = (this.status && this.status.virtualHeight) || '120px'
return this.virtualHidden ? { height } : {}
},
threadDisplayStatus () {
return this.conversation.reduce((a, k) => {
const id = k.id
const depth = this.depths[id]
const status = (() => {
if (this.threadDisplayStatusObject[id]) {
return this.threadDisplayStatusObject[id]
}
if ((depth - this.diveDepth) <= this.maxDepthToShowByDefault) {
return 'showing'
} else {
return 'hidden'
}
})()
a[id] = status
return a
}, {})
},
statusContentProperties () {
return this.conversation.reduce((a, k) => {
const id = k.id
const props = (() => {
const def = {
showingTall: false,
expandingSubject: false,
showingLongSubject: false,
isReplying: false,
mediaPlaying: []
}
if (this.statusContentPropertiesObject[id]) {
return {
...def,
...this.statusContentPropertiesObject[id]
}
}
return def
})()
a[id] = props
return a
}, {})
},
canDive () {
return this.isTreeView && this.isExpanded
},
focused () {
return (id) => {
return (this.isExpanded) && id === this.highlight
}
},
maybeHighlight () {
return this.isExpanded ? this.highlight : null
} }
}, },
components: { components: {
Status Status,
ThreadTree
}, },
watch: { watch: {
statusId (newVal, oldVal) { statusId (newVal, oldVal) {
@ -120,7 +358,15 @@ const conversation = {
expanded (value) { expanded (value) {
if (value) { if (value) {
this.fetchConversation() this.fetchConversation()
} else {
this.resetDisplayState()
} }
},
virtualHidden (value) {
this.$store.dispatch(
'setVirtualHeight',
{ statusId: this.statusId, height: `${this.$el.clientHeight}px` }
)
} }
}, },
methods: { methods: {
@ -143,8 +389,8 @@ const conversation = {
getReplies (id) { getReplies (id) {
return this.replies[id] || [] return this.replies[id] || []
}, },
focused (id) { getHighlight () {
return (this.isExpanded) && id === this.statusId return this.isExpanded ? this.highlight : null
}, },
setHighlight (id) { setHighlight (id) {
if (!id) return if (!id) return
@ -152,15 +398,139 @@ const conversation = {
this.$store.dispatch('fetchFavsAndRepeats', id) this.$store.dispatch('fetchFavsAndRepeats', id)
this.$store.dispatch('fetchEmojiReactionsBy', id) this.$store.dispatch('fetchEmojiReactionsBy', id)
}, },
getHighlight () {
return this.isExpanded ? this.highlight : null
},
toggleExpanded () { toggleExpanded () {
this.expanded = !this.expanded this.expanded = !this.expanded
}, },
getConversationId (statusId) { getConversationId (statusId) {
const status = this.$store.state.statuses.allStatusesObject[statusId] const status = this.$store.state.statuses.allStatusesObject[statusId]
return get(status, 'retweeted_status.statusnet_conversation_id', get(status, 'statusnet_conversation_id')) return get(status, 'retweeted_status.statusnet_conversation_id', get(status, 'statusnet_conversation_id'))
},
setThreadDisplay (id, nextStatus) {
this.threadDisplayStatusObject = {
...this.threadDisplayStatusObject,
[id]: nextStatus
}
},
toggleThreadDisplay (id) {
const curStatus = this.threadDisplayStatus[id]
const nextStatus = curStatus === 'showing' ? 'hidden' : 'showing'
this.setThreadDisplay(id, nextStatus)
},
setThreadDisplayRecursively (id, nextStatus) {
this.setThreadDisplay(id, nextStatus)
this.getReplies(id).map(k => k.id).map(id => this.setThreadDisplayRecursively(id, nextStatus))
},
showThreadRecursively (id) {
this.setThreadDisplayRecursively(id, 'showing')
},
setStatusContentProperty (id, name, value) {
this.statusContentPropertiesObject = {
...this.statusContentPropertiesObject,
[id]: {
...this.statusContentPropertiesObject[id],
[name]: value
}
}
},
toggleStatusContentProperty (id, name) {
this.setStatusContentProperty(id, name, !this.statusContentProperties[id][name])
},
leastVisibleAncestor (id) {
let cur = id
let parent = this.parentOf(cur)
while (cur) {
// if the parent is showing it means cur is visible
if (this.threadDisplayStatus[parent] === 'showing') {
return cur
}
parent = this.parentOf(parent)
cur = this.parentOf(cur)
}
// nothing found, fall back to toplevel
return this.topLevel[0] ? this.topLevel[0].id : undefined
},
diveIntoStatus (id, preventScroll) {
this.tryScrollTo(id)
},
diveToTopLevel () {
this.tryScrollTo(this.topLevelAncestorOrSelfId(this.diveRoot) || this.topLevel[0].id)
},
// only used when we are not on a page
undive () {
this.inlineDivePosition = null
this.setHighlight(this.statusId)
},
tryScrollTo (id) {
if (!id) {
return
}
if (this.isPage) {
// set statusId
this.$router.push({ name: 'conversation', params: { id } })
} else {
this.inlineDivePosition = id
}
// Because the conversation can be unmounted when out of sight
// and mounted again when it comes into sight,
// the `mounted` or `created` function in `status` should not
// contain scrolling calls, as we do not want the page to jump
// when we scroll with an expanded conversation.
//
// Now the method is to rely solely on the `highlight` watcher
// in `status` components.
// In linear views, all statuses are rendered at all times, but
// in tree views, it is possible that a change in active status
// removes and adds status components (e.g. an originally child
// status becomes an ancestor status, and thus they will be
// different).
// Here, let the components be rendered first, in order to trigger
// the `highlight` watcher.
this.$nextTick(() => {
this.setHighlight(id)
})
},
goToCurrent () {
this.tryScrollTo(this.diveRoot || this.topLevel[0].id)
},
statusById (id) {
return this.statusMap[id]
},
parentOf (id) {
const status = this.statusById(id)
if (!status) {
return undefined
}
const { in_reply_to_status_id: parentId } = status
if (!this.statusMap[parentId]) {
return undefined
}
return parentId
},
parentOrSelf (id) {
return this.parentOf(id) || id
},
// Ancestors of some status, from top to bottom
ancestorsOf (id) {
const ancestors = []
let cur = this.parentOf(id)
while (cur) {
ancestors.unshift(this.statusMap[cur])
cur = this.parentOf(cur)
}
return ancestors
},
topLevelAncestorOrSelfId (id) {
let cur = id
let parent = this.parentOf(id)
while (parent) {
cur = this.parentOf(cur)
parent = this.parentOf(parent)
}
return cur
},
resetDisplayState () {
this.undive()
this.threadDisplayStatusObject = {}
} }
} }
} }

View file

@ -1,5 +1,7 @@
<template> <template>
<div <div
v-if="!hideStatus"
:style="hiddenStyle"
class="Conversation" class="Conversation"
:class="{ '-expanded' : isExpanded, 'panel' : isExpanded }" :class="{ '-expanded' : isExpanded, 'panel' : isExpanded }"
> >
@ -8,31 +10,189 @@
class="panel-heading conversation-heading" class="panel-heading conversation-heading"
> >
<span class="title"> {{ $t('timeline.conversation') }} </span> <span class="title"> {{ $t('timeline.conversation') }} </span>
<span v-if="collapsable"> <button
<a v-if="collapsable"
href="#" class="button-unstyled -link"
@click.prevent="toggleExpanded" @click.prevent="toggleExpanded"
>{{ $t('timeline.collapse') }}</a> >
</span> {{ $t('timeline.collapse') }}
</button>
</div>
<div class="conversation-body panel-body">
<div
v-if="isTreeView"
class="thread-body"
>
<div
v-if="shouldShowAllConversationButton"
class="conversation-dive-to-top-level-box"
>
<i18n-t
keypath="status.show_all_conversation_with_icon"
tag="button"
class="button-unstyled -link"
@click.prevent="diveToTopLevel"
scope="global"
>
<template #icon>
<FAIcon
icon="angle-double-left"
/>
</template>
<template #text>
<span>
{{ $tc('status.show_all_conversation', otherTopLevelCount, { numStatus: otherTopLevelCount }) }}
</span>
</template>
</i18n-t>
</div>
<div
v-if="shouldShowAncestors"
class="thread-ancestors"
>
<div
v-for="status in ancestorsOf(diveRoot)"
:key="status.id"
class="thread-ancestor"
:class="{'thread-ancestor-has-other-replies': getReplies(status.id).length > 1, '-faded': shouldFadeAncestors}"
>
<status
ref="statusComponent"
:inline-expanded="collapsable && isExpanded"
:statusoid="status"
:expandable="!isExpanded"
:show-pinned="pinnedStatusIdsObject && pinnedStatusIdsObject[status.id]"
:focused="focused(status.id)"
:in-conversation="isExpanded"
:highlight="getHighlight()"
:replies="getReplies(status.id)"
:in-profile="inProfile"
:profile-user-id="profileUserId"
class="conversation-status status-fadein panel-body"
:simple-tree="treeViewIsSimple"
:toggle-thread-display="toggleThreadDisplay"
:thread-display-status="threadDisplayStatus"
:show-thread-recursively="showThreadRecursively"
:total-reply-count="totalReplyCount"
:total-reply-depth="totalReplyDepth"
:show-other-replies-as-button="showOtherRepliesButtonInsideStatus"
:dive="() => diveIntoStatus(status.id)"
:controlled-showing-tall="statusContentProperties[status.id].showingTall"
:controlled-expanding-subject="statusContentProperties[status.id].expandingSubject"
:controlled-showing-long-subject="statusContentProperties[status.id].showingLongSubject"
:controlled-replying="statusContentProperties[status.id].replying"
:controlled-media-playing="statusContentProperties[status.id].mediaPlaying"
:controlled-toggle-showing-tall="() => toggleStatusContentProperty(status.id, 'showingTall')"
:controlled-toggle-expanding-subject="() => toggleStatusContentProperty(status.id, 'expandingSubject')"
:controlled-toggle-showing-long-subject="() => toggleStatusContentProperty(status.id, 'showingLongSubject')"
:controlled-toggle-replying="() => toggleStatusContentProperty(status.id, 'replying')"
:controlled-set-media-playing="(newVal) => toggleStatusContentProperty(status.id, 'mediaPlaying', newVal)"
@goto="setHighlight"
@toggleExpanded="toggleExpanded"
/>
<div
v-if="showOtherRepliesButtonBelowStatus && getReplies(status.id).length > 1"
class="thread-ancestor-dive-box"
>
<div
class="thread-ancestor-dive-box-inner"
>
<i18n-t
tag="button"
scope="global"
keypath="status.ancestor_follow_with_icon"
class="button-unstyled -link thread-tree-show-replies-button"
@click.prevent="diveIntoStatus(status.id)"
>
<template #icon>
<FAIcon
icon="angle-double-right"
/>
</template>
<template #text>
<span>
{{ $tc('status.ancestor_follow', getReplies(status.id).length - 1, { numReplies: getReplies(status.id).length - 1 }) }}
</span>
</template>
</i18n-t>
</div>
</div>
</div>
</div>
<thread-tree
v-for="status in showingTopLevel"
:key="status.id"
ref="statusComponent"
:depth="0"
:status="status"
:in-profile="inProfile"
:conversation="conversation"
:collapsable="collapsable"
:is-expanded="isExpanded"
:pinned-status-ids-object="pinnedStatusIdsObject"
:profile-user-id="profileUserId"
:focused="focused"
:get-replies="getReplies"
:highlight="maybeHighlight"
:set-highlight="setHighlight"
:toggle-expanded="toggleExpanded"
:simple="treeViewIsSimple"
:toggle-thread-display="toggleThreadDisplay"
:thread-display-status="threadDisplayStatus"
:show-thread-recursively="showThreadRecursively"
:total-reply-count="totalReplyCount"
:total-reply-depth="totalReplyDepth"
:status-content-properties="statusContentProperties"
:set-status-content-property="setStatusContentProperty"
:toggle-status-content-property="toggleStatusContentProperty"
:dive="canDive ? diveIntoStatus : undefined"
/>
</div>
<div
v-if="isLinearView"
class="thread-body"
>
<status
v-for="status in conversation"
:key="status.id"
ref="statusComponent"
:inline-expanded="collapsable && isExpanded"
:statusoid="status"
:expandable="!isExpanded"
:show-pinned="pinnedStatusIdsObject && pinnedStatusIdsObject[status.id]"
:focused="focused(status.id)"
:in-conversation="isExpanded"
:highlight="getHighlight()"
:replies="getReplies(status.id)"
:in-profile="inProfile"
:profile-user-id="profileUserId"
class="conversation-status status-fadein panel-body"
:toggle-thread-display="toggleThreadDisplay"
:thread-display-status="threadDisplayStatus"
:show-thread-recursively="showThreadRecursively"
:total-reply-count="totalReplyCount"
:total-reply-depth="totalReplyDepth"
:status-content-properties="statusContentProperties"
:set-status-content-property="setStatusContentProperty"
:toggle-status-content-property="toggleStatusContentProperty"
@goto="setHighlight"
@toggleExpanded="toggleExpanded"
/>
</div>
</div> </div>
<status
v-for="status in conversation"
:key="status.id"
:inline-expanded="collapsable && isExpanded"
:statusoid="status"
:expandable="!isExpanded"
:show-pinned="pinnedStatusIdsObject && pinnedStatusIdsObject[status.id]"
:focused="focused(status.id)"
:in-conversation="isExpanded"
:highlight="getHighlight()"
:replies="getReplies(status.id)"
:in-profile="inProfile"
:profile-user-id="profileUserId"
class="conversation-status status-fadein panel-body"
@goto="setHighlight"
@toggleExpanded="toggleExpanded"
/>
</div> </div>
<div
v-else
:style="hiddenStyle"
/>
</template> </template>
<script src="./conversation.js"></script> <script src="./conversation.js"></script>
@ -41,27 +201,74 @@
@import '../../_variables.scss'; @import '../../_variables.scss';
.Conversation { .Conversation {
.conversation-dive-to-top-level-box {
padding: var(--status-margin, $status-margin);
border-bottom-width: 1px;
border-bottom-style: solid;
border-bottom-color: var(--border, $fallback--border);
border-radius: 0;
/* Make the button stretch along the whole row */
display: flex;
align-items: stretch;
flex-direction: column;
}
.thread-ancestors {
margin-left: var(--status-margin, $status-margin);
border-left: 2px solid var(--border, $fallback--border);
}
.thread-ancestor.-faded .StatusContent {
--link: var(--faintLink);
--text: var(--faint);
color: var(--text);
}
.thread-ancestor-dive-box {
padding-left: var(--status-margin, $status-margin);
border-bottom-width: 1px;
border-bottom-style: solid;
border-bottom-color: var(--border, $fallback--border);
border-radius: 0;
/* Make the button stretch along the whole row */
&, &-inner {
display: flex;
align-items: stretch;
flex-direction: column;
}
}
.thread-ancestor-dive-box-inner {
padding: var(--status-margin, $status-margin);
}
.conversation-status { .conversation-status {
border-left: none;
border-bottom-width: 1px; border-bottom-width: 1px;
border-bottom-style: solid; border-bottom-style: solid;
border-bottom-color: var(--border, $fallback--border); border-bottom-color: var(--border, $fallback--border);
border-radius: 0; border-radius: 0;
} }
&.-expanded { .thread-ancestor-has-other-replies .conversation-status,
.conversation-status { .thread-ancestor:last-child .conversation-status,
border-color: $fallback--border; .thread-ancestor:last-child .thread-ancestor-dive-box,
border-color: var(--border, $fallback--border); &.-expanded .thread-tree .conversation-status {
border-left: 4px solid $fallback--cRed; border-bottom: none;
border-left: 4px solid var(--cRed, $fallback--cRed); }
}
.conversation-status:last-child { .thread-ancestors + .thread-tree > .conversation-status {
border-bottom: none; border-top-width: 1px;
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius; border-top-style: solid;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius); border-top-color: var(--border, $fallback--border);
} }
/* expanded conversation in timeline */
&.status-fadein.-expanded .thread-body {
border-left-width: 4px;
border-left-style: solid;
border-left-color: $fallback--cRed;
border-left-color: var(--cRed, $fallback--cRed);
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
border-bottom: 1px solid var(--border, $fallback--border);
} }
} }
</style> </style>

View file

@ -0,0 +1,89 @@
import SearchBar from 'components/search_bar/search_bar.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faSignInAlt,
faSignOutAlt,
faHome,
faComments,
faBell,
faUserPlus,
faBullhorn,
faSearch,
faTachometerAlt,
faCog,
faInfoCircle
} from '@fortawesome/free-solid-svg-icons'
library.add(
faSignInAlt,
faSignOutAlt,
faHome,
faComments,
faBell,
faUserPlus,
faBullhorn,
faSearch,
faTachometerAlt,
faCog,
faInfoCircle
)
export default {
components: {
SearchBar
},
data: () => ({
searchBarHidden: true,
supportsMask: window.CSS && window.CSS.supports && (
window.CSS.supports('mask-size', 'contain') ||
window.CSS.supports('-webkit-mask-size', 'contain') ||
window.CSS.supports('-moz-mask-size', 'contain') ||
window.CSS.supports('-ms-mask-size', 'contain') ||
window.CSS.supports('-o-mask-size', 'contain')
)
}),
computed: {
enableMask () { return this.supportsMask && this.$store.state.instance.logoMask },
logoStyle () {
return {
'visibility': this.enableMask ? 'hidden' : 'visible'
}
},
logoMaskStyle () {
return this.enableMask ? {
'mask-image': `url(${this.$store.state.instance.logo})`
} : {
'background-color': this.enableMask ? '' : 'transparent'
}
},
logoBgStyle () {
return Object.assign({
'margin': `${this.$store.state.instance.logoMargin} 0`,
opacity: this.searchBarHidden ? 1 : 0
}, this.enableMask ? {} : {
'background-color': this.enableMask ? '' : 'transparent'
})
},
logo () { return this.$store.state.instance.logo },
sitename () { return this.$store.state.instance.name },
hideSitename () { return this.$store.state.instance.hideSitename },
logoLeft () { return this.$store.state.instance.logoLeft },
currentUser () { return this.$store.state.users.currentUser },
privateMode () { return this.$store.state.instance.private }
},
methods: {
scrollToTop () {
window.scrollTo(0, 0)
},
logout () {
this.$router.replace('/main/public')
this.$store.dispatch('logout')
},
onSearchBarToggled (hidden) {
this.searchBarHidden = hidden
},
openSettingsModal () {
this.$store.dispatch('openSettingsModal')
}
}
}

View file

@ -0,0 +1,117 @@
@import '../../_variables.scss';
.DesktopNav {
height: 50px;
width: 100%;
position: fixed;
a {
color: var(--topBarLink, $fallback--link);
}
.inner-nav {
display: grid;
grid-template-rows: 50px;
grid-template-columns: 2fr auto 2fr;
grid-template-areas: "sitename logo actions";
box-sizing: border-box;
padding: 0 1.2em;
margin: auto;
max-width: 980px;
}
&.-logoLeft {
grid-template-columns: auto 2fr 2fr;
grid-template-areas: "logo sitename actions";
}
.button-default {
&, svg {
color: $fallback--text;
color: var(--btnTopBarText, $fallback--text);
}
&:active {
background-color: $fallback--fg;
background-color: var(--btnPressedTopBar, $fallback--fg);
color: $fallback--text;
color: var(--btnPressedTopBarText, $fallback--text);
}
&:disabled {
color: $fallback--text;
color: var(--btnDisabledTopBarText, $fallback--text);
}
&.toggled {
color: $fallback--text;
color: var(--btnToggledTopBarText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnToggledTopBar, $fallback--fg)
}
}
.logo {
grid-area: logo;
position: relative;
transition: opacity;
transition-timing-function: ease-out;
transition-duration: 100ms;
@media all and (min-width: 800px) {
opacity: 1 !important;
}
.mask {
mask-repeat: no-repeat;
mask-position: center;
mask-size: contain;
background-color: $fallback--fg;
background-color: var(--topBarText, $fallback--fg);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
img {
display: inline-block;
height: 50px;
}
}
.nav-icon {
margin-left: 0.2em;
width: 2em;
height: 100%;
text-align: center;
.svg-inline--fa {
color: $fallback--link;
color: var(--topBarLink, $fallback--link);
}
}
.sitename {
grid-area: sitename;
}
.actions {
grid-area: actions;
}
.item {
flex: 1;
line-height: 50px;
height: 50px;
overflow: hidden;
display: flex;
flex-wrap: wrap;
&.right {
justify-content: flex-end;
text-align: right;
}
}
}

View file

@ -0,0 +1,82 @@
<template>
<nav
id="nav"
class="DesktopNav"
:class="{ '-logoLeft': logoLeft }"
@click="scrollToTop()"
>
<div class="inner-nav">
<div class="item sitename">
<router-link
v-if="!hideSitename"
class="site-name"
:to="{ name: 'root' }"
active-class="home"
>
{{ sitename }}
</router-link>
</div>
<router-link
class="logo"
:to="{ name: 'root' }"
:style="logoBgStyle"
>
<div
class="mask"
:style="logoMaskStyle"
/>
<img
:src="logo"
:style="logoStyle"
>
</router-link>
<div class="item right actions">
<search-bar
v-if="currentUser || !privateMode"
@toggled="onSearchBarToggled"
@click.stop
/>
<button
class="button-unstyled nav-icon"
@click.stop="openSettingsModal"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="cog"
:title="$t('nav.preferences')"
/>
</button>
<a
v-if="currentUser && currentUser.role === 'admin'"
href="/pleroma/admin/#/login-pleroma"
class="nav-icon"
target="_blank"
@click.stop
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="tachometer-alt"
:title="$t('nav.administration')"
/>
</a>
<button
v-if="currentUser"
class="button-unstyled nav-icon"
@click.prevent="logout"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="sign-out-alt"
:title="$t('login.logout')"
/>
</button>
</div>
</div>
</nav>
</template>
<script src="./desktop_nav.js"></script>
<style src="./desktop_nav.scss" lang="scss"></style>

View file

@ -6,20 +6,20 @@
<ProgressButton <ProgressButton
v-if="muted" v-if="muted"
:click="unmuteDomain" :click="unmuteDomain"
class="btn btn-default" class="btn button-default"
> >
{{ $t('domain_mute_card.unmute') }} {{ $t('domain_mute_card.unmute') }}
<template slot="progress"> <template v-slot:progress>
{{ $t('domain_mute_card.unmute_progress') }} {{ $t('domain_mute_card.unmute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
<ProgressButton <ProgressButton
v-else v-else
:click="muteDomain" :click="muteDomain"
class="btn btn-default" class="btn button-default"
> >
{{ $t('domain_mute_card.mute') }} {{ $t('domain_mute_card.mute') }}
<template slot="progress"> <template v-slot:progress>
{{ $t('domain_mute_card.mute_progress') }} {{ $t('domain_mute_card.mute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>

View file

@ -3,6 +3,15 @@ import EmojiPicker from '../emoji_picker/emoji_picker.vue'
import { take } from 'lodash' import { take } from 'lodash'
import { findOffset } from '../../services/offset_finder/offset_finder.service.js' import { findOffset } from '../../services/offset_finder/offset_finder.service.js'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faSmileBeam
} from '@fortawesome/free-regular-svg-icons'
library.add(
faSmileBeam
)
/** /**
* EmojiInput - augmented inputs for emoji and autocomplete support in inputs * EmojiInput - augmented inputs for emoji and autocomplete support in inputs
* without having to give up the comfort of <input/> and <textarea/> elements * without having to give up the comfort of <input/> and <textarea/> elements
@ -22,6 +31,7 @@ import { findOffset } from '../../services/offset_finder/offset_finder.service.j
*/ */
const EmojiInput = { const EmojiInput = {
emits: ['update:modelValue', 'shown'],
props: { props: {
suggest: { suggest: {
/** /**
@ -48,7 +58,7 @@ const EmojiInput = {
required: true, required: true,
type: Function type: Function
}, },
value: { modelValue: {
/** /**
* Used for v-model * Used for v-model
*/ */
@ -105,7 +115,8 @@ const EmojiInput = {
showPicker: false, showPicker: false,
temporarilyHideSuggestions: false, temporarilyHideSuggestions: false,
keepOpen: false, keepOpen: false,
disableClickOutside: false disableClickOutside: false,
suggestions: []
} }
}, },
components: { components: {
@ -115,21 +126,6 @@ const EmojiInput = {
padEmoji () { padEmoji () {
return this.$store.getters.mergedConfig.padEmoji return this.$store.getters.mergedConfig.padEmoji
}, },
suggestions () {
const firstchar = this.textAtCaret.charAt(0)
if (this.textAtCaret === firstchar) { return [] }
const matchedSuggestions = this.suggest(this.textAtCaret)
if (matchedSuggestions.length <= 0) {
return []
}
return take(matchedSuggestions, 5)
.map(({ imageUrl, ...rest }, index) => ({
...rest,
// eslint-disable-next-line camelcase
img: imageUrl || '',
highlighted: index === this.highlighted
}))
},
showSuggestions () { showSuggestions () {
return this.focused && return this.focused &&
this.suggestions && this.suggestions &&
@ -141,52 +137,78 @@ const EmojiInput = {
return (this.wordAtCaret || {}).word || '' return (this.wordAtCaret || {}).word || ''
}, },
wordAtCaret () { wordAtCaret () {
if (this.value && this.caret) { if (this.modelValue && this.caret) {
const word = Completion.wordAtPosition(this.value, this.caret - 1) || {} const word = Completion.wordAtPosition(this.modelValue, this.caret - 1) || {}
return word return word
} }
} }
}, },
mounted () { mounted () {
const slots = this.$slots.default const { root } = this.$refs
if (!slots || slots.length === 0) return const input = root.querySelector('.emoji-input > input') || root.querySelector('.emoji-input > textarea')
const input = slots.find(slot => ['input', 'textarea'].includes(slot.tag))
if (!input) return if (!input) return
this.input = input this.input = input
this.resize() this.resize()
input.elm.addEventListener('blur', this.onBlur) input.addEventListener('blur', this.onBlur)
input.elm.addEventListener('focus', this.onFocus) input.addEventListener('focus', this.onFocus)
input.elm.addEventListener('paste', this.onPaste) input.addEventListener('paste', this.onPaste)
input.elm.addEventListener('keyup', this.onKeyUp) input.addEventListener('keyup', this.onKeyUp)
input.elm.addEventListener('keydown', this.onKeyDown) input.addEventListener('keydown', this.onKeyDown)
input.elm.addEventListener('click', this.onClickInput) input.addEventListener('click', this.onClickInput)
input.elm.addEventListener('transitionend', this.onTransition) input.addEventListener('transitionend', this.onTransition)
input.elm.addEventListener('input', this.onInput) input.addEventListener('input', this.onInput)
}, },
unmounted () { unmounted () {
const { input } = this const { input } = this
if (input) { if (input) {
input.elm.removeEventListener('blur', this.onBlur) input.removeEventListener('blur', this.onBlur)
input.elm.removeEventListener('focus', this.onFocus) input.removeEventListener('focus', this.onFocus)
input.elm.removeEventListener('paste', this.onPaste) input.removeEventListener('paste', this.onPaste)
input.elm.removeEventListener('keyup', this.onKeyUp) input.removeEventListener('keyup', this.onKeyUp)
input.elm.removeEventListener('keydown', this.onKeyDown) input.removeEventListener('keydown', this.onKeyDown)
input.elm.removeEventListener('click', this.onClickInput) input.removeEventListener('click', this.onClickInput)
input.elm.removeEventListener('transitionend', this.onTransition) input.removeEventListener('transitionend', this.onTransition)
input.elm.removeEventListener('input', this.onInput) input.removeEventListener('input', this.onInput)
} }
}, },
watch: { watch: {
showSuggestions: function (newValue) { showSuggestions: function (newValue) {
this.$emit('shown', newValue) this.$emit('shown', newValue)
},
textAtCaret: async function (newWord) {
const firstchar = newWord.charAt(0)
this.suggestions = []
if (newWord === firstchar) return
const matchedSuggestions = await this.suggest(newWord)
// Async: cancel if textAtCaret has changed during wait
if (this.textAtCaret !== newWord) return
if (matchedSuggestions.length <= 0) return
this.suggestions = take(matchedSuggestions, 5)
.map(({ imageUrl, ...rest }) => ({
...rest,
img: imageUrl || ''
}))
},
suggestions: {
handler (newValue) {
this.$nextTick(this.resize)
},
deep: true
} }
}, },
methods: { methods: {
focusPickerInput () {
const pickerEl = this.$refs.picker.$el
if (!pickerEl) return
const pickerInput = pickerEl.querySelector('input')
if (pickerInput) pickerInput.focus()
},
triggerShowPicker () { triggerShowPicker () {
this.showPicker = true this.showPicker = true
this.$refs.picker.startEmojiLoad() this.$refs.picker.startEmojiLoad()
this.$nextTick(() => { this.$nextTick(() => {
this.scrollIntoView() this.scrollIntoView()
this.focusPickerInput()
}) })
// This temporarily disables "click outside" handler // This temporarily disables "click outside" handler
// since external trigger also means click originates // since external trigger also means click originates
@ -197,21 +219,22 @@ const EmojiInput = {
}, 0) }, 0)
}, },
togglePicker () { togglePicker () {
this.input.elm.focus() this.input.focus()
this.showPicker = !this.showPicker this.showPicker = !this.showPicker
if (this.showPicker) { if (this.showPicker) {
this.scrollIntoView() this.scrollIntoView()
this.$refs.picker.startEmojiLoad() this.$refs.picker.startEmojiLoad()
this.$nextTick(this.focusPickerInput)
} }
}, },
replace (replacement) { replace (replacement) {
const newValue = Completion.replaceWord(this.value, this.wordAtCaret, replacement) const newValue = Completion.replaceWord(this.modelValue, this.wordAtCaret, replacement)
this.$emit('input', newValue) this.$emit('update:modelValue', newValue)
this.caret = 0 this.caret = 0
}, },
insert ({ insertion, keepOpen, surroundingSpace = true }) { insert ({ insertion, keepOpen, surroundingSpace = true }) {
const before = this.value.substring(0, this.caret) || '' const before = this.modelValue.substring(0, this.caret) || ''
const after = this.value.substring(this.caret) || '' const after = this.modelValue.substring(this.caret) || ''
/* Using a bit more smart approach to padding emojis with spaces: /* Using a bit more smart approach to padding emojis with spaces:
* - put a space before cursor if there isn't one already, unless we * - put a space before cursor if there isn't one already, unless we
@ -239,16 +262,16 @@ const EmojiInput = {
after after
].join('') ].join('')
this.keepOpen = keepOpen this.keepOpen = keepOpen
this.$emit('input', newValue) this.$emit('update:modelValue', newValue)
const position = this.caret + (insertion + spaceAfter + spaceBefore).length const position = this.caret + (insertion + spaceAfter + spaceBefore).length
if (!keepOpen) { if (!keepOpen) {
this.input.elm.focus() this.input.focus()
} }
this.$nextTick(function () { this.$nextTick(function () {
// Re-focus inputbox after clicking suggestion // Re-focus inputbox after clicking suggestion
// Set selection right after the replacement instead of the very end // Set selection right after the replacement instead of the very end
this.input.elm.setSelectionRange(position, position) this.input.setSelectionRange(position, position)
this.caret = position this.caret = position
}) })
}, },
@ -258,16 +281,16 @@ const EmojiInput = {
if (len > 0 || suggestion) { if (len > 0 || suggestion) {
const chosenSuggestion = suggestion || this.suggestions[this.highlighted] const chosenSuggestion = suggestion || this.suggestions[this.highlighted]
const replacement = chosenSuggestion.replacement const replacement = chosenSuggestion.replacement
const newValue = Completion.replaceWord(this.value, this.wordAtCaret, replacement) const newValue = Completion.replaceWord(this.modelValue, this.wordAtCaret, replacement)
this.$emit('input', newValue) this.$emit('update:modelValue', newValue)
this.highlighted = 0 this.highlighted = 0
const position = this.wordAtCaret.start + replacement.length const position = this.wordAtCaret.start + replacement.length
this.$nextTick(function () { this.$nextTick(function () {
// Re-focus inputbox after clicking suggestion // Re-focus inputbox after clicking suggestion
this.input.elm.focus() this.input.focus()
// Set selection right after the replacement instead of the very end // Set selection right after the replacement instead of the very end
this.input.elm.setSelectionRange(position, position) this.input.setSelectionRange(position, position)
this.caret = position this.caret = position
}) })
e.preventDefault() e.preventDefault()
@ -329,7 +352,7 @@ const EmojiInput = {
} }
this.$nextTick(() => { this.$nextTick(() => {
const { offsetHeight } = this.input.elm const { offsetHeight } = this.input
const { picker } = this.$refs const { picker } = this.$refs
const pickerBottom = picker.$el.getBoundingClientRect().bottom const pickerBottom = picker.$el.getBoundingClientRect().bottom
if (pickerBottom > window.innerHeight) { if (pickerBottom > window.innerHeight) {
@ -394,8 +417,8 @@ const EmojiInput = {
// Scroll the input element to the position of the cursor // Scroll the input element to the position of the cursor
this.$nextTick(() => { this.$nextTick(() => {
this.input.elm.blur() this.input.blur()
this.input.elm.focus() this.input.focus()
}) })
} }
// Disable suggestions hotkeys if suggestions are hidden // Disable suggestions hotkeys if suggestions are hidden
@ -424,7 +447,7 @@ const EmojiInput = {
// de-focuses the element (i.e. default browser behavior) // de-focuses the element (i.e. default browser behavior)
if (key === 'Escape') { if (key === 'Escape') {
if (!this.temporarilyHideSuggestions) { if (!this.temporarilyHideSuggestions) {
this.input.elm.focus() this.input.focus()
} }
} }
@ -435,7 +458,7 @@ const EmojiInput = {
this.showPicker = false this.showPicker = false
this.setCaret(e) this.setCaret(e)
this.resize() this.resize()
this.$emit('input', e.target.value) this.$emit('update:modelValue', e.target.value)
}, },
onClickInput (e) { onClickInput (e) {
this.showPicker = false this.showPicker = false
@ -460,7 +483,7 @@ const EmojiInput = {
if (!panel) return if (!panel) return
const picker = this.$refs.picker.$el const picker = this.$refs.picker.$el
const panelBody = this.$refs['panel-body'] const panelBody = this.$refs['panel-body']
const { offsetHeight, offsetTop } = this.input.elm const { offsetHeight, offsetTop } = this.input
const offsetBottom = offsetTop + offsetHeight const offsetBottom = offsetTop + offsetHeight
this.setPlacement(panelBody, panel, offsetBottom) this.setPlacement(panelBody, panel, offsetBottom)
@ -474,7 +497,7 @@ const EmojiInput = {
if (this.placement === 'top' || (this.placement === 'auto' && this.overflowsBottom(container))) { if (this.placement === 'top' || (this.placement === 'auto' && this.overflowsBottom(container))) {
target.style.top = 'auto' target.style.top = 'auto'
target.style.bottom = this.input.elm.offsetHeight + 'px' target.style.bottom = this.input.offsetHeight + 'px'
} }
}, },
overflowsBottom (el) { overflowsBottom (el) {

View file

@ -1,18 +1,20 @@
<template> <template>
<div <div
ref="root"
v-click-outside="onClickOutside" v-click-outside="onClickOutside"
class="emoji-input" class="emoji-input"
:class="{ 'with-picker': !hideEmojiButton }" :class="{ 'with-picker': !hideEmojiButton }"
> >
<slot /> <slot />
<template v-if="enableEmojiPicker"> <template v-if="enableEmojiPicker">
<div <button
v-if="!hideEmojiButton" v-if="!hideEmojiButton"
class="emoji-picker-icon" class="button-unstyled emoji-picker-icon"
type="button"
@click.prevent="togglePicker" @click.prevent="togglePicker"
> >
<i class="icon-smile" /> <FAIcon :icon="['far', 'smile-beam']" />
</div> </button>
<EmojiPicker <EmojiPicker
v-if="enableEmojiPicker" v-if="enableEmojiPicker"
ref="picker" ref="picker"
@ -37,7 +39,7 @@
v-for="(suggestion, index) in suggestions" v-for="(suggestion, index) in suggestions"
:key="index" :key="index"
class="autocomplete-item" class="autocomplete-item"
:class="{ highlighted: suggestion.highlighted }" :class="{ highlighted: index === highlighted }"
@click.stop.prevent="onClick($event, suggestion)" @click.stop.prevent="onClick($event, suggestion)"
> >
<span class="image"> <span class="image">

View file

@ -1,4 +1,3 @@
import { debounce } from 'lodash'
/** /**
* suggest - generates a suggestor function to be used by emoji-input * suggest - generates a suggestor function to be used by emoji-input
* data: object providing source information for specific types of suggestions: * data: object providing source information for specific types of suggestions:
@ -11,19 +10,19 @@ import { debounce } from 'lodash'
* doesn't support user linking you can just provide only emoji. * doesn't support user linking you can just provide only emoji.
*/ */
const debounceUserSearch = debounce((data, input) => { export default data => {
data.updateUsersList(input) const emojiCurry = suggestEmoji(data.emoji)
}, 500) const usersCurry = data.store && suggestUsers(data.store)
return input => {
export default data => input => { const firstChar = input[0]
const firstChar = input[0] if (firstChar === ':' && data.emoji) {
if (firstChar === ':' && data.emoji) { return emojiCurry(input)
return suggestEmoji(data.emoji)(input) }
if (firstChar === '@' && usersCurry) {
return usersCurry(input)
}
return []
} }
if (firstChar === '@' && data.users) {
return suggestUsers(data)(input)
}
return []
} }
export const suggestEmoji = emojis => input => { export const suggestEmoji = emojis => input => {
@ -57,50 +56,75 @@ export const suggestEmoji = emojis => input => {
}) })
} }
export const suggestUsers = data => input => { export const suggestUsers = ({ dispatch, state }) => {
const noPrefix = input.toLowerCase().substr(1) // Keep some persistent values in closure, most importantly for the
const users = data.users // custom debounce to work. Lodash debounce does not return a promise.
let suggestions = []
let previousQuery = ''
let timeout = null
let cancelUserSearch = null
const newUsers = users.filter( const userSearch = (query) => dispatch('searchUsers', { query })
user => const debounceUserSearch = (query) => {
user.screen_name.toLowerCase().startsWith(noPrefix) || cancelUserSearch && cancelUserSearch()
user.name.toLowerCase().startsWith(noPrefix) return new Promise((resolve, reject) => {
timeout = setTimeout(() => {
/* taking only 20 results so that sorting is a bit cheaper, we display userSearch(query).then(resolve).catch(reject)
* only 5 anyway. could be inaccurate, but we ideally we should query }, 300)
* backend anyway cancelUserSearch = () => {
*/ clearTimeout(timeout)
).slice(0, 20).sort((a, b) => { resolve([])
let aScore = 0 }
let bScore = 0 })
}
// Matches on screen name (i.e. user@instance) makes a priority
aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0 return async input => {
bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0 const noPrefix = input.toLowerCase().substr(1)
if (previousQuery === noPrefix) return suggestions
// Matches on name takes second priority
aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0 suggestions = []
bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0 previousQuery = noPrefix
// Fetch more and wait, don't fetch if there's the 2nd @ because
const diff = (bScore - aScore) * 10 // the backend user search can't deal with it.
// Reference semantics make it so that we get the updated data after
// Then sort alphabetically // the await.
const nameAlphabetically = a.name > b.name ? 1 : -1 if (!noPrefix.includes('@')) {
const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1 await debounceUserSearch(noPrefix)
}
return diff + nameAlphabetically + screenNameAlphabetically
/* eslint-disable camelcase */ const newSuggestions = state.users.users.filter(
}).map(({ screen_name, name, profile_image_url_original }) => ({ user =>
displayText: screen_name, user.screen_name.toLowerCase().startsWith(noPrefix) ||
detailText: name, user.name.toLowerCase().startsWith(noPrefix)
imageUrl: profile_image_url_original, ).slice(0, 20).sort((a, b) => {
replacement: '@' + screen_name + ' ' let aScore = 0
})) let bScore = 0
// BE search users to get more comprehensive results // Matches on screen name (i.e. user@instance) makes a priority
if (data.updateUsersList) { aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
debounceUserSearch(data, noPrefix) bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
// Matches on name takes second priority
aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
const diff = (bScore - aScore) * 10
// Then sort alphabetically
const nameAlphabetically = a.name > b.name ? 1 : -1
const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1
return diff + nameAlphabetically + screenNameAlphabetically
/* eslint-disable camelcase */
}).map(({ screen_name, screen_name_ui, name, profile_image_url_original }) => ({
displayText: screen_name_ui,
detailText: name,
imageUrl: profile_image_url_original,
replacement: '@' + screen_name + ' '
}))
/* eslint-enable camelcase */
suggestions = newSuggestions || []
return suggestions
} }
return newUsers
/* eslint-enable camelcase */
} }

View file

@ -1,4 +1,17 @@
import { defineAsyncComponent } from 'vue'
import Checkbox from '../checkbox/checkbox.vue' import Checkbox from '../checkbox/checkbox.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faBoxOpen,
faStickyNote,
faSmileBeam
} from '@fortawesome/free-solid-svg-icons'
library.add(
faBoxOpen,
faStickyNote,
faSmileBeam
)
// At widest, approximately 20 emoji are visible in a row, // At widest, approximately 20 emoji are visible in a row,
// loading 3 rows, could be overkill for narrow picker // loading 3 rows, could be overkill for narrow picker
@ -8,7 +21,20 @@ const LOAD_EMOJI_BY = 60
const LOAD_EMOJI_MARGIN = 64 const LOAD_EMOJI_MARGIN = 64
const filterByKeyword = (list, keyword = '') => { const filterByKeyword = (list, keyword = '') => {
return list.filter(x => x.displayText.includes(keyword)) if (keyword === '') return list
const keywordLowercase = keyword.toLowerCase()
let orderedEmojiList = []
for (const emoji of list) {
const indexOfKeyword = emoji.displayText.toLowerCase().indexOf(keywordLowercase)
if (indexOfKeyword > -1) {
if (!Array.isArray(orderedEmojiList[indexOfKeyword])) {
orderedEmojiList[indexOfKeyword] = []
}
orderedEmojiList[indexOfKeyword].push(emoji)
}
}
return orderedEmojiList.flat()
} }
const EmojiPicker = { const EmojiPicker = {
@ -32,7 +58,7 @@ const EmojiPicker = {
} }
}, },
components: { components: {
StickerPicker: () => import('../sticker_picker/sticker_picker.vue'), StickerPicker: defineAsyncComponent(() => import('../sticker_picker/sticker_picker.vue')),
Checkbox Checkbox
}, },
methods: { methods: {
@ -54,7 +80,7 @@ const EmojiPicker = {
}, },
highlight (key) { highlight (key) {
const ref = this.$refs['group-' + key] const ref = this.$refs['group-' + key]
const top = ref[0].offsetTop const top = ref.offsetTop
this.setShowStickers(false) this.setShowStickers(false)
this.activeGroup = key this.activeGroup = key
this.$nextTick(() => { this.$nextTick(() => {
@ -71,7 +97,7 @@ const EmojiPicker = {
} }
}, },
triggerLoadMore (target) { triggerLoadMore (target) {
const ref = this.$refs['group-end-custom'][0] const ref = this.$refs['group-end-custom']
if (!ref) return if (!ref) return
const bottom = ref.offsetTop + ref.offsetHeight const bottom = ref.offsetTop + ref.offsetHeight
@ -94,7 +120,7 @@ const EmojiPicker = {
this.$nextTick(() => { this.$nextTick(() => {
this.emojisView.forEach(group => { this.emojisView.forEach(group => {
const ref = this.$refs['group-' + group.id] const ref = this.$refs['group-' + group.id]
if (ref[0].offsetTop <= top) { if (ref.offsetTop <= top) {
this.activeGroup = group.id this.activeGroup = group.id
} }
}) })
@ -164,13 +190,13 @@ const EmojiPicker = {
{ {
id: 'custom', id: 'custom',
text: this.$t('emoji.custom'), text: this.$t('emoji.custom'),
icon: 'icon-smile', icon: 'smile-beam',
emojis: customEmojis emojis: customEmojis
}, },
{ {
id: 'standard', id: 'standard',
text: this.$t('emoji.unicode'), text: this.$t('emoji.unicode'),
icon: 'icon-picture', icon: 'box-open',
emojis: filterByKeyword(standardEmojis, this.keyword) emojis: filterByKeyword(standardEmojis, this.keyword)
} }
] ]

View file

@ -82,7 +82,7 @@
&.active { &.active {
border-bottom: 4px solid; border-bottom: 4px solid;
i { svg {
color: $fallback--lightText; color: $fallback--lightText;
color: var(--lightText, $fallback--lightText); color: var(--lightText, $fallback--lightText);
} }

View file

@ -13,7 +13,10 @@
:title="group.text" :title="group.text"
@click.prevent="highlight(group.id)" @click.prevent="highlight(group.id)"
> >
<i :class="group.icon" /> <FAIcon
:icon="group.icon"
fixed-width
/>
</span> </span>
</span> </span>
<span <span
@ -26,7 +29,10 @@
:title="$t('emoji.stickers')" :title="$t('emoji.stickers')"
@click.prevent="toggleStickers" @click.prevent="toggleStickers"
> >
<i class="icon-star" /> <FAIcon
icon="sticky-note"
fixed-width
/>
</span> </span>
</span> </span>
</div> </div>

View file

@ -6,7 +6,7 @@
:users="accountsForEmoji[reaction.name]" :users="accountsForEmoji[reaction.name]"
> >
<button <button
class="emoji-reaction btn btn-default" class="emoji-reaction btn button-default"
:class="{ 'picked-reaction': reactedWith(reaction.name), 'not-clickable': !loggedIn }" :class="{ 'picked-reaction': reactedWith(reaction.name), 'not-clickable': !loggedIn }"
@click="emojiOnClick(reaction.name, $event)" @click="emojiOnClick(reaction.name, $event)"
@mouseenter="fetchEmojiReactionsByIfMissing()" @mouseenter="fetchEmojiReactionsByIfMissing()"

View file

@ -1,102 +0,0 @@
<template>
<div class="import-export-container">
<slot name="before" />
<button
class="btn"
@click="exportData"
>
{{ exportLabel }}
</button>
<button
class="btn"
@click="importData"
>
{{ importLabel }}
</button>
<slot name="afterButtons" />
<p
v-if="importFailed"
class="alert error"
>
{{ importFailedText }}
</p>
<slot name="afterError" />
</div>
</template>
<script>
export default {
props: [
'exportObject',
'importLabel',
'exportLabel',
'importFailedText',
'validator',
'onImport',
'onImportFailure'
],
data () {
return {
importFailed: false
}
},
methods: {
exportData () {
const stringified = JSON.stringify(this.exportObject, null, 2) // Pretty-print and indent with 2 spaces
// Create an invisible link with a data url and simulate a click
const e = document.createElement('a')
e.setAttribute('download', 'pleroma_theme.json')
e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified))
e.style.display = 'none'
document.body.appendChild(e)
e.click()
document.body.removeChild(e)
},
importData () {
this.importFailed = false
const filePicker = document.createElement('input')
filePicker.setAttribute('type', 'file')
filePicker.setAttribute('accept', '.json')
filePicker.addEventListener('change', event => {
if (event.target.files[0]) {
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({ target }) => {
try {
const parsed = JSON.parse(target.result)
const valid = this.validator(parsed)
if (valid) {
this.onImport(parsed)
} else {
this.importFailed = true
// this.onImportFailure(valid)
}
} catch (e) {
// This will happen both if there is a JSON syntax error or the theme is missing components
this.importFailed = true
// this.onImportFailure(e)
}
}
reader.readAsText(event.target.files[0])
}
})
document.body.appendChild(filePicker)
filePicker.click()
document.body.removeChild(filePicker)
}
}
}
</script>
<style lang="scss">
.import-export-container {
display: flex;
flex-wrap: wrap;
align-items: baseline;
justify-content: center;
}
</style>

View file

@ -1,3 +1,10 @@
import { library } from '@fortawesome/fontawesome-svg-core'
import { faCircleNotch } from '@fortawesome/free-solid-svg-icons'
library.add(
faCircleNotch
)
const Exporter = { const Exporter = {
props: { props: {
getContent: { getContent: {
@ -8,18 +15,8 @@ const Exporter = {
type: String, type: String,
default: 'export.csv' default: 'export.csv'
}, },
exportButtonLabel: { exportButtonLabel: { type: String },
type: String, processingMessage: { type: String }
default () {
return this.$t('exporter.export')
}
},
processingMessage: {
type: String,
default () {
return this.$t('exporter.processing')
}
}
}, },
data () { data () {
return { return {

View file

@ -1,15 +1,20 @@
<template> <template>
<div class="exporter"> <div class="exporter">
<div v-if="processing"> <div v-if="processing">
<i class="icon-spin4 animate-spin exporter-processing" /> <FAIcon
<span>{{ processingMessage }}</span> icon="circle-notch"
size="lg"
spin
/>
<span>{{ processingMessage || $t('exporter.processing') }}</span>
</div> </div>
<button <button
v-else v-else
class="btn btn-default" class="btn button-default"
@click="process" @click="process"
> >
{{ exportButtonLabel }} {{ exportButtonLabel || $t('exporter.export') }}
</button> </button>
</div> </div>
</template> </template>
@ -19,7 +24,6 @@
<style lang="scss"> <style lang="scss">
.exporter { .exporter {
&-processing { &-processing {
font-size: 1.5em;
margin: 0.25em; margin: 0.25em;
} }
} }

View file

@ -1,4 +1,28 @@
import Popover from '../popover/popover.vue' import Popover from '../popover/popover.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faEllipsisH,
faBookmark,
faEyeSlash,
faThumbtack,
faShareAlt,
faExternalLinkAlt
} from '@fortawesome/free-solid-svg-icons'
import {
faBookmark as faBookmarkReg,
faFlag
} from '@fortawesome/free-regular-svg-icons'
library.add(
faEllipsisH,
faBookmark,
faBookmarkReg,
faEyeSlash,
faThumbtack,
faShareAlt,
faExternalLinkAlt,
faFlag
)
const ExtraButtons = { const ExtraButtons = {
props: [ 'status' ], props: [ 'status' ],
@ -44,6 +68,9 @@ const ExtraButtons = {
this.$store.dispatch('unbookmark', { id: this.status.id }) this.$store.dispatch('unbookmark', { id: this.status.id })
.then(() => this.$emit('onSuccess')) .then(() => this.$emit('onSuccess'))
.catch(err => this.$emit('onError', err.error.error)) .catch(err => this.$emit('onError', err.error.error))
},
reportStatus () {
this.$store.dispatch('openUserReportingModal', { userId: this.status.user.id, statusIds: [this.status.id] })
} }
}, },
computed: { computed: {

View file

@ -1,82 +1,131 @@
<template> <template>
<Popover <Popover
class="ExtraButtons"
trigger="click" trigger="click"
placement="top" placement="top"
class="extra-button-popover" :offset="{ y: 5 }"
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
remove-padding
> >
<div <template v-slot:content="{close}">
slot="content"
slot-scope="{close}"
>
<div class="dropdown-menu"> <div class="dropdown-menu">
<button <button
v-if="canMute && !status.thread_muted" v-if="canMute && !status.thread_muted"
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="muteConversation" @click.prevent="muteConversation"
> >
<i class="icon-eye-off" /><span>{{ $t("status.mute_conversation") }}</span> <FAIcon
fixed-width
icon="eye-slash"
/><span>{{ $t("status.mute_conversation") }}</span>
</button> </button>
<button <button
v-if="canMute && status.thread_muted" v-if="canMute && status.thread_muted"
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="unmuteConversation" @click.prevent="unmuteConversation"
> >
<i class="icon-eye-off" /><span>{{ $t("status.unmute_conversation") }}</span> <FAIcon
fixed-width
icon="eye-slash"
/><span>{{ $t("status.unmute_conversation") }}</span>
</button> </button>
<button <button
v-if="!status.pinned && canPin" v-if="!status.pinned && canPin"
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="pinStatus" @click.prevent="pinStatus"
@click="close" @click="close"
> >
<i class="icon-pin" /><span>{{ $t("status.pin") }}</span> <FAIcon
fixed-width
icon="thumbtack"
/><span>{{ $t("status.pin") }}</span>
</button> </button>
<button <button
v-if="status.pinned && canPin" v-if="status.pinned && canPin"
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="unpinStatus" @click.prevent="unpinStatus"
@click="close" @click="close"
> >
<i class="icon-pin" /><span>{{ $t("status.unpin") }}</span> <FAIcon
fixed-width
icon="thumbtack"
/><span>{{ $t("status.unpin") }}</span>
</button> </button>
<button <button
v-if="!status.bookmarked" v-if="!status.bookmarked"
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="bookmarkStatus" @click.prevent="bookmarkStatus"
@click="close" @click="close"
> >
<i class="icon-bookmark-empty" /><span>{{ $t("status.bookmark") }}</span> <FAIcon
fixed-width
:icon="['far', 'bookmark']"
/><span>{{ $t("status.bookmark") }}</span>
</button> </button>
<button <button
v-if="status.bookmarked" v-if="status.bookmarked"
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="unbookmarkStatus" @click.prevent="unbookmarkStatus"
@click="close" @click="close"
> >
<i class="icon-bookmark" /><span>{{ $t("status.unbookmark") }}</span> <FAIcon
fixed-width
icon="bookmark"
/><span>{{ $t("status.unbookmark") }}</span>
</button> </button>
<button <button
v-if="canDelete" v-if="canDelete"
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="deleteStatus" @click.prevent="deleteStatus"
@click="close" @click="close"
> >
<i class="icon-cancel" /><span>{{ $t("status.delete") }}</span> <FAIcon
fixed-width
icon="times"
/><span>{{ $t("status.delete") }}</span>
</button> </button>
<button <button
class="dropdown-item dropdown-item-icon" class="button-default dropdown-item dropdown-item-icon"
@click.prevent="copyLink" @click.prevent="copyLink"
@click="close" @click="close"
> >
<i class="icon-share" /><span>{{ $t("status.copy_link") }}</span> <FAIcon
fixed-width
icon="share-alt"
/><span>{{ $t("status.copy_link") }}</span>
</button>
<a
v-if="!status.is_local"
class="button-default dropdown-item dropdown-item-icon"
title="Source"
:href="status.external_url"
target="_blank"
>
<FAIcon
fixed-width
icon="external-link-alt"
/><span>{{ $t("status.external_source") }}</span>
</a>
<button
class="button-default dropdown-item dropdown-item-icon"
@click.prevent="reportStatus"
@click="close"
>
<FAIcon
fixed-width
:icon="['far', 'flag']"
/><span>{{ $t("user_card.report") }}</span>
</button> </button>
</div> </div>
</div> </template>
<i <template v-slot:trigger>
slot="trigger" <button class="button-unstyled popover-trigger">
class="icon-ellipsis button-icon" <FAIcon
/> class="fa-scale-110 fa-old-padding"
icon="ellipsis-h"
/>
</button>
</template>
</Popover> </Popover>
</template> </template>
@ -85,13 +134,21 @@
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.icon-ellipsis { .ExtraButtons {
cursor: pointer; /* override of popover internal stuff */
.popover-trigger-button {
width: auto;
}
&:hover, .popover-trigger {
.extra-button-popover.open & { position: static;
color: $fallback--text; padding: 10px;
color: var(--text, $fallback--text); margin: -10px;
&:hover .svg-inline--fa {
color: $fallback--text;
color: var(--text, $fallback--text);
}
} }
} }
</style> </style>

View file

@ -1,4 +1,14 @@
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core'
import { faStar } from '@fortawesome/free-solid-svg-icons'
import {
faStar as faStarRegular
} from '@fortawesome/free-regular-svg-icons'
library.add(
faStar,
faStarRegular
)
const FavoriteButton = { const FavoriteButton = {
props: ['status', 'loggedIn'], props: ['status', 'loggedIn'],
@ -21,13 +31,6 @@ const FavoriteButton = {
} }
}, },
computed: { computed: {
classes () {
return {
'icon-star-empty': !this.status.favorited,
'icon-star': this.status.favorited,
'animate-spin': this.animated
}
},
...mapGetters(['mergedConfig']) ...mapGetters(['mergedConfig'])
} }
} }

View file

@ -1,20 +1,31 @@
<template> <template>
<div v-if="loggedIn"> <div class="FavoriteButton">
<i <button
:class="classes" v-if="loggedIn"
class="button-icon favorite-button fav-active" class="button-unstyled interactive"
:class="status.favorited && '-favorited'"
:title="$t('tool_tip.favorite')" :title="$t('tool_tip.favorite')"
@click.prevent="favorite()" @click.prevent="favorite()"
/> >
<span v-if="!mergedConfig.hidePostStats && status.fave_num > 0">{{ status.fave_num }}</span> <FAIcon
</div> class="fa-scale-110 fa-old-padding"
<div v-else> :icon="[status.favorited ? 'fas' : 'far', 'star']"
<i :spin="animated"
:class="classes" />
class="button-icon favorite-button" </button>
:title="$t('tool_tip.favorite')" <span v-else>
/> <FAIcon
<span v-if="!mergedConfig.hidePostStats && status.fave_num > 0">{{ status.fave_num }}</span> class="fa-scale-110 fa-old-padding"
:title="$t('tool_tip.favorite')"
:icon="['far', 'star']"
/>
</span>
<span
v-if="!mergedConfig.hidePostStats && status.fave_num > 0"
class="action-counter"
>
{{ status.fave_num }}
</span>
</div> </div>
</template> </template>
@ -23,18 +34,29 @@
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.fav-active { .FavoriteButton {
cursor: pointer; display: flex;
animation-duration: 0.6s;
&:hover { > :first-child {
color: $fallback--cOrange; padding: 10px;
color: var(--cOrange, $fallback--cOrange); margin: -10px -8px -10px -10px;
}
.action-counter {
pointer-events: none;
user-select: none;
}
.interactive {
.svg-inline--fa {
animation-duration: 0.6s;
}
&:hover .svg-inline--fa,
&.-favorited .svg-inline--fa {
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
}
} }
} }
.favorite-button.icon-star {
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
}
</style> </style>

View file

@ -1,12 +1,15 @@
import fileSizeFormatService from '../../services/file_size_format/file_size_format.js'
const FeaturesPanel = { const FeaturesPanel = {
computed: { computed: {
chat: function () { return this.$store.state.instance.chatAvailable }, shout: function () { return this.$store.state.instance.shoutAvailable },
pleromaChatMessages: function () { return this.$store.state.instance.pleromaChatMessagesAvailable }, pleromaChatMessages: function () { return this.$store.state.instance.pleromaChatMessagesAvailable },
gopher: function () { return this.$store.state.instance.gopherAvailable }, gopher: function () { return this.$store.state.instance.gopherAvailable },
whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled }, whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled },
mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable }, mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable },
minimalScopesMode: function () { return this.$store.state.instance.minimalScopesMode }, minimalScopesMode: function () { return this.$store.state.instance.minimalScopesMode },
textlimit: function () { return this.$store.state.instance.textlimit } textlimit: function () { return this.$store.state.instance.textlimit },
uploadlimit: function () { return fileSizeFormatService.fileSizeFormat(this.$store.state.instance.uploadlimit) }
} }
} }

View file

@ -8,8 +8,8 @@
</div> </div>
<div class="panel-body features-panel"> <div class="panel-body features-panel">
<ul> <ul>
<li v-if="chat"> <li v-if="shout">
{{ $t('features_panel.chat') }} {{ $t('features_panel.shout') }}
</li> </li>
<li v-if="pleromaChatMessages"> <li v-if="pleromaChatMessages">
{{ $t('features_panel.pleroma_chat_messages') }} {{ $t('features_panel.pleroma_chat_messages') }}
@ -25,6 +25,7 @@
</li> </li>
<li>{{ $t('features_panel.scope_options') }}</li> <li>{{ $t('features_panel.scope_options') }}</li>
<li>{{ $t('features_panel.text_limit') }} = {{ textlimit }}</li> <li>{{ $t('features_panel.text_limit') }} = {{ textlimit }}</li>
<li>{{ $t('features_panel.upload_limit') }} = {{ uploadlimit.num }} {{ $t('upload.file_size_units.' + uploadlimit.unit) }}</li>
</ul> </ul>
</div> </div>
</div> </div>

View file

@ -0,0 +1,53 @@
import RuffleService from '../../services/ruffle_service/ruffle_service.js'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faStop,
faExclamationTriangle
} from '@fortawesome/free-solid-svg-icons'
library.add(
faStop,
faExclamationTriangle
)
const Flash = {
props: [ 'src' ],
data () {
return {
player: false, // can be true, "hidden", false. hidden = element exists
loaded: false,
ruffleInstance: null
}
},
methods: {
openPlayer () {
if (this.player) return // prevent double-loading, or re-loading on failure
this.player = 'hidden'
RuffleService.getRuffle().then((ruffle) => {
const player = ruffle.newest().createPlayer()
player.config = {
letterbox: 'on'
}
const container = this.$refs.container
container.appendChild(player)
player.style.width = '100%'
player.style.height = '100%'
player.load(this.src).then(() => {
this.player = true
}).catch((e) => {
console.error('Error loading ruffle', e)
this.player = 'error'
})
this.ruffleInstance = player
this.$emit('playerOpened')
})
},
closePlayer () {
this.ruffleInstance && this.ruffleInstance.remove()
this.player = false
this.$emit('playerClosed')
}
}
}
export default Flash

View file

@ -0,0 +1,84 @@
<template>
<div class="Flash">
<div
v-if="player === true || player === 'hidden'"
ref="container"
class="player"
:class="{ hidden: player === 'hidden' }"
/>
<button
v-if="player !== true"
class="button-unstyled placeholder"
@click="openPlayer"
>
<span
v-if="player === 'hidden'"
class="label"
>
{{ $t('general.loading') }}
</span>
<span
v-if="player === 'error'"
class="label"
>
{{ $t('general.flash_fail') }}
</span>
<span
v-else
class="label"
>
<p>
{{ $t('general.flash_content') }}
</p>
<p>
<FAIcon icon="exclamation-triangle" />
{{ $t('general.flash_security') }}
</p>
</span>
</button>
</div>
</template>
<script src="./flash.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.Flash {
display: inline-block;
width: 100%;
height: 100%;
position: relative;
.player {
height: 100%;
width: 100%;
}
.placeholder {
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
background: var(--bg);
color: var(--link);
}
.hider {
top: 0;
}
.label {
text-align: center;
flex: 1 1 0;
line-height: 1.2;
white-space: normal;
word-wrap: normal;
}
.hidden {
display: none;
visibility: 'hidden';
}
}
</style>

View file

@ -1,6 +1,6 @@
import { requestFollow, requestUnfollow } from '../../services/follow_manipulate/follow_manipulate' import { requestFollow, requestUnfollow } from '../../services/follow_manipulate/follow_manipulate'
export default { export default {
props: ['relationship', 'labelFollowing', 'buttonClass'], props: ['relationship', 'user', 'labelFollowing', 'buttonClass'],
data () { data () {
return { return {
inProgress: false inProgress: false
@ -14,7 +14,7 @@ export default {
if (this.inProgress || this.relationship.following) { if (this.inProgress || this.relationship.following) {
return this.$t('user_card.follow_unfollow') return this.$t('user_card.follow_unfollow')
} else if (this.relationship.requested) { } else if (this.relationship.requested) {
return this.$t('user_card.follow_again') return this.$t('user_card.follow_cancel')
} else { } else {
return this.$t('user_card.follow') return this.$t('user_card.follow')
} }
@ -29,11 +29,14 @@ export default {
} else { } else {
return this.$t('user_card.follow') return this.$t('user_card.follow')
} }
},
disabled () {
return this.inProgress || this.user.deactivated
} }
}, },
methods: { methods: {
onClick () { onClick () {
this.relationship.following ? this.unfollow() : this.follow() this.relationship.following || this.relationship.requested ? this.unfollow() : this.follow()
}, },
follow () { follow () {
this.inProgress = true this.inProgress = true

View file

@ -1,8 +1,8 @@
<template> <template>
<button <button
class="btn btn-default follow-button" class="btn button-default follow-button"
:class="{ toggled: isPressed }" :class="{ toggled: isPressed }"
:disabled="inProgress" :disabled="disabled"
:title="title" :title="title"
@click="onClick" @click="onClick"
> >

View file

@ -20,6 +20,7 @@
:relationship="relationship" :relationship="relationship"
:label-following="$t('user_card.follow_unfollow')" :label-following="$t('user_card.follow_unfollow')"
class="follow-card-follow-button" class="follow-card-follow-button"
:user="user"
/> />
</template> </template>
</div> </div>

View file

@ -2,13 +2,13 @@
<basic-user-card :user="user"> <basic-user-card :user="user">
<div class="follow-request-card-content-container"> <div class="follow-request-card-content-container">
<button <button
class="btn btn-default" class="btn button-default"
@click="approveUser" @click="approveUser"
> >
{{ $t('user_card.approve') }} {{ $t('user_card.approve') }}
</button> </button>
<button <button
class="btn btn-default" class="btn button-default"
@click="denyUser" @click="denyUser"
> >
{{ $t('user_card.deny') }} {{ $t('user_card.deny') }}

View file

@ -1,7 +1,9 @@
<template> <template>
<div class="settings panel panel-default"> <div class="settings panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
{{ $t('nav.friend_requests') }} <div class="title">
{{ $t('nav.friend_requests') }}
</div>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<FollowRequestCard <FollowRequestCard

View file

@ -1,12 +1,17 @@
import { set } from 'vue' import { set } from 'lodash'
import Select from '../select/select.vue'
export default { export default {
components: {
Select
},
props: [ props: [
'name', 'label', 'value', 'fallback', 'options', 'no-inherit' 'name', 'label', 'modelValue', 'fallback', 'options', 'no-inherit'
], ],
emits: ['update:modelValue'],
data () { data () {
return { return {
lValue: this.value, lValue: this.modelValue,
availableOptions: [ availableOptions: [
this.noInherit ? '' : 'inherit', this.noInherit ? '' : 'inherit',
'custom', 'custom',
@ -18,7 +23,7 @@ export default {
} }
}, },
beforeUpdate () { beforeUpdate () {
this.lValue = this.value this.lValue = this.modelValue
}, },
computed: { computed: {
present () { present () {
@ -33,7 +38,7 @@ export default {
}, },
set (v) { set (v) {
set(this.lValue, 'family', v) set(this.lValue, 'family', v)
this.$emit('input', this.lValue) this.$emit('update:modelValue', this.lValue)
} }
}, },
isCustom () { isCustom () {

View file

@ -15,34 +15,28 @@
class="opt exlcude-disabled" class="opt exlcude-disabled"
type="checkbox" type="checkbox"
:checked="present" :checked="present"
@input="$emit('input', typeof value === 'undefined' ? fallback : undefined)" @change="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)"
> >
<label <label
v-if="typeof fallback !== 'undefined'" v-if="typeof fallback !== 'undefined'"
class="opt-l" class="opt-l"
:for="name + '-o'" :for="name + '-o'"
/> />
<label {{ ' ' }}
:for="name + '-font-switcher'" <Select
class="select" :id="name + '-font-switcher'"
v-model="preset"
:disabled="!present" :disabled="!present"
class="font-switcher"
> >
<select <option
:id="name + '-font-switcher'" v-for="option in availableOptions"
v-model="preset" :key="option"
:disabled="!present" :value="option"
class="font-switcher"
> >
<option {{ option === 'custom' ? $t('settings.style.fonts.custom') : option }}
v-for="option in availableOptions" </option>
:key="option" </Select>
:value="option"
>
{{ option === 'custom' ? $t('settings.style.fonts.custom') : option }}
</option>
</select>
<i class="icon-down-open" />
</label>
<input <input
v-if="isCustom" v-if="isCustom"
:id="name" :id="name"
@ -62,7 +56,8 @@
min-width: 10em; min-width: 10em;
} }
&.custom { &.custom {
.select { /* TODO Should make proper joiners... */
.font-switcher {
border-top-right-radius: 0; border-top-right-radius: 0;
border-bottom-right-radius: 0; border-bottom-right-radius: 0;
} }

View file

@ -1,15 +1,26 @@
import Attachment from '../attachment/attachment.vue' import Attachment from '../attachment/attachment.vue'
import { chunk, last, dropRight, sumBy } from 'lodash' import { sumBy, set } from 'lodash'
const Gallery = { const Gallery = {
props: [ props: [
'attachments', 'attachments',
'limitRows',
'descriptions',
'limit',
'nsfw', 'nsfw',
'setMedia' 'setMedia',
'size',
'editable',
'removeAttachment',
'shiftUpAttachment',
'shiftDnAttachment',
'editAttachment',
'grid'
], ],
data () { data () {
return { return {
sizes: {} sizes: {},
hidingLong: true
} }
}, },
components: { Attachment }, components: { Attachment },
@ -18,26 +29,70 @@ const Gallery = {
if (!this.attachments) { if (!this.attachments) {
return [] return []
} }
const rows = chunk(this.attachments, 3) const attachments = this.limit > 0
if (last(rows).length === 1 && rows.length > 1) { ? this.attachments.slice(0, this.limit)
// if 1 attachment on last row -> add it to the previous row instead : this.attachments
const lastAttachment = last(rows)[0] if (this.size === 'hide') {
const allButLastRow = dropRight(rows) return attachments.map(item => ({ minimal: true, items: [item] }))
last(allButLastRow).push(lastAttachment)
return allButLastRow
} }
const rows = this.grid
? [{ grid: true, items: attachments }]
: attachments.reduce((acc, attachment, i) => {
if (attachment.mimetype.includes('audio')) {
return [...acc, { audio: true, items: [attachment] }, { items: [] }]
}
if (!(
attachment.mimetype.includes('image') ||
attachment.mimetype.includes('video') ||
attachment.mimetype.includes('flash')
)) {
return [...acc, { minimal: true, items: [attachment] }, { items: [] }]
}
const maxPerRow = 3
const attachmentsRemaining = this.attachments.length - i + 1
const currentRow = acc[acc.length - 1].items
currentRow.push(attachment)
if (currentRow.length >= maxPerRow && attachmentsRemaining > maxPerRow) {
return [...acc, { items: [] }]
} else {
return acc
}
}, [{ items: [] }]).filter(_ => _.items.length > 0)
return rows return rows
}, },
useContainFit () { attachmentsDimensionalScore () {
return this.$store.getters.mergedConfig.useContainFit return this.rows.reduce((acc, row) => {
let size = 0
if (row.minimal) {
size += 1 / 8
} else if (row.audio) {
size += 1 / 4
} else {
size += 1 / (row.items.length + 0.6)
}
return acc + size
}, 0)
},
tooManyAttachments () {
if (this.editable || this.size === 'small') {
return false
} else if (this.size === 'hide') {
return this.attachments.length > 8
} else {
return this.attachmentsDimensionalScore > 1
}
} }
}, },
methods: { methods: {
onNaturalSizeLoad (id, size) { onNaturalSizeLoad ({ id, width, height }) {
this.$set(this.sizes, id, size) set(this.sizes, id, { width, height })
}, },
rowStyle (itemsPerRow) { rowStyle (row) {
return { 'padding-bottom': `${(100 / (itemsPerRow + 0.6))}%` } if (row.audio) {
return { 'padding-bottom': '25%' } // fixed reduced height for audio
} else if (!row.minimal && !row.grid) {
return { 'padding-bottom': `${(100 / (row.items.length + 0.6))}%` }
}
}, },
itemStyle (id, row) { itemStyle (id, row) {
const total = sumBy(row, item => this.getAspectRatio(item.id)) const total = sumBy(row, item => this.getAspectRatio(item.id))
@ -46,6 +101,16 @@ const Gallery = {
getAspectRatio (id) { getAspectRatio (id) {
const size = this.sizes[id] const size = this.sizes[id]
return size ? size.width / size.height : 1 return size ? size.width / size.height : 1
},
toggleHidingLong (event) {
this.hidingLong = event
},
openGallery () {
this.$store.dispatch('setMedia', this.attachments)
this.$store.dispatch('setCurrentMedia', this.attachments[0])
},
onMedia () {
this.$store.dispatch('setMedia', this.attachments)
} }
} }
} }

View file

@ -1,26 +1,83 @@
<template> <template>
<div <div
ref="galleryContainer" ref="galleryContainer"
style="width: 100%;" class="Gallery"
:class="{ '-long': tooManyAttachments && hidingLong }"
> >
<div class="gallery-rows">
<div
v-for="(row, rowIndex) in rows"
:key="rowIndex"
class="gallery-row"
:style="rowStyle(row)"
:class="{ '-audio': row.audio, '-minimal': row.minimal, '-grid': grid }"
>
<div
class="gallery-row-inner"
:class="{ '-grid': grid }"
>
<Attachment
v-for="(attachment, attachmentIndex) in row.items"
:key="attachment.id"
class="gallery-item"
:nsfw="nsfw"
:attachment="attachment"
:size="size"
:editable="editable"
:remove="removeAttachment"
:shift-up="!(attachmentIndex === 0 && rowIndex === 0) && shiftUpAttachment"
:shift-dn="!(attachmentIndex === row.items.length - 1 && rowIndex === rows.length - 1) && shiftDnAttachment"
:edit="editAttachment"
:description="descriptions && descriptions[attachment.id]"
:hide-description="size === 'small' || tooManyAttachments && hidingLong"
:style="itemStyle(attachment.id, row.items)"
@setMedia="onMedia"
@naturalSizeLoad="onNaturalSizeLoad"
/>
</div>
</div>
</div>
<div <div
v-for="(row, index) in rows" v-if="tooManyAttachments"
:key="index" class="many-attachments"
class="gallery-row"
:style="rowStyle(row.length)"
:class="{ 'contain-fit': useContainFit, 'cover-fit': !useContainFit }"
> >
<div class="gallery-row-inner"> <div class="many-attachments-text">
<attachment {{ $t("status.many_attachments", { number: attachments.length }) }}
v-for="attachment in row" </div>
:key="attachment.id" <div class="many-attachments-buttons">
:set-media="setMedia" <span
:nsfw="nsfw" v-if="!hidingLong"
:attachment="attachment" class="many-attachments-button"
:allow-play="false" >
:natural-size-load="onNaturalSizeLoad.bind(null, attachment.id)" <button
:style="itemStyle(attachment.id, row)" class="button-unstyled -link"
/> @click="toggleHidingLong(true)"
>
{{ $t("status.collapse_attachments") }}
</button>
</span>
<span
v-if="hidingLong"
class="many-attachments-button"
>
<button
class="button-unstyled -link"
@click="toggleHidingLong(false)"
>
{{ $t("status.show_all_attachments") }}
</button>
</span>
<span
v-if="hidingLong"
class="many-attachments-button"
>
<button
class="button-unstyled -link"
@click="openGallery"
>
{{ $t("status.open_gallery") }}
</button>
</span>
</div> </div>
</div> </div>
</div> </div>
@ -31,12 +88,66 @@
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.gallery-row { .Gallery {
position: relative; .gallery-rows {
height: 0; display: flex;
width: 100%; flex-direction: column;
flex-grow: 1; }
margin-top: 0.5em;
.gallery-row {
position: relative;
height: 0;
width: 100%;
flex-grow: 1;
&:not(:first-child) {
margin-top: 0.5em;
}
}
&.-long {
.gallery-rows {
max-height: 25em;
overflow: hidden;
mask:
linear-gradient(to top, white, transparent) bottom/100% 70px no-repeat,
linear-gradient(to top, white, white);
/* Autoprefixed seem to ignore this one, and also syntax is different */
-webkit-mask-composite: xor;
mask-composite: exclude;
}
}
.many-attachments-text {
text-align: center;
line-height: 2;
}
.many-attachments-buttons {
display: flex;
}
.many-attachments-button {
display: flex;
flex: 1;
justify-content: center;
line-height: 2;
button {
padding: 0 2em;
}
}
.gallery-row {
&.-grid,
&.-minimal {
height: auto;
.gallery-row-inner {
position: relative;
}
}
}
.gallery-row-inner { .gallery-row-inner {
position: absolute; position: absolute;
@ -48,9 +159,24 @@
flex-direction: row; flex-direction: row;
flex-wrap: nowrap; flex-wrap: nowrap;
align-content: stretch; align-content: stretch;
&.-grid {
width: 100%;
height: auto;
position: relative;
display: grid;
grid-column-gap: 0.5em;
grid-row-gap: 0.5em;
grid-template-columns: repeat(auto-fill, minmax(15em, 1fr));
.gallery-item {
margin: 0;
height: 200px;
}
}
} }
.gallery-row-inner .attachment { .gallery-item {
margin: 0 0.5em 0 0; margin: 0 0.5em 0 0;
flex-grow: 1; flex-grow: 1;
height: 100%; height: 100%;
@ -61,32 +187,5 @@
margin: 0; margin: 0;
} }
} }
.image-attachment {
width: 100%;
height: 100%;
}
.video-container {
height: 100%;
}
&.contain-fit {
img,
video,
canvas {
object-fit: contain;
height: 100%;
}
}
&.cover-fit {
img,
video,
canvas {
object-fit: cover;
}
}
} }
</style> </style>

View file

@ -1,3 +1,11 @@
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faTimes
} from '@fortawesome/free-solid-svg-icons'
library.add(
faTimes
)
const GlobalNoticeList = { const GlobalNoticeList = {
computed: { computed: {

View file

@ -9,10 +9,15 @@
<div class="notice-message"> <div class="notice-message">
{{ $t(notice.messageKey, notice.messageArgs) }} {{ $t(notice.messageKey, notice.messageArgs) }}
</div> </div>
<i <button
class="button-icon icon-cancel" class="button-unstyled close-notice"
@click="closeNotice(notice)" @click="closeNotice(notice)"
/> >
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
/>
</button>
</div> </div>
</div> </div>
</template> </template>
@ -53,7 +58,7 @@
.global-error { .global-error {
background-color: var(--alertPopupError, $fallback--cRed); background-color: var(--alertPopupError, $fallback--cRed);
color: var(--alertPopupErrorText, $fallback--text); color: var(--alertPopupErrorText, $fallback--text);
i { .svg-inline--fa {
color: var(--alertPopupErrorText, $fallback--text); color: var(--alertPopupErrorText, $fallback--text);
} }
} }
@ -61,17 +66,32 @@
.global-warning { .global-warning {
background-color: var(--alertPopupWarning, $fallback--cOrange); background-color: var(--alertPopupWarning, $fallback--cOrange);
color: var(--alertPopupWarningText, $fallback--text); color: var(--alertPopupWarningText, $fallback--text);
i { .svg-inline--fa {
color: var(--alertPopupWarningText, $fallback--text); color: var(--alertPopupWarningText, $fallback--text);
} }
} }
.global-success {
background-color: var(--alertPopupSuccess, $fallback--cGreen);
color: var(--alertPopupSuccessText, $fallback--text);
.svg-inline--fa {
color: var(--alertPopupSuccessText, $fallback--text);
}
}
.global-info { .global-info {
background-color: var(--alertPopupNeutral, $fallback--fg); background-color: var(--alertPopupNeutral, $fallback--fg);
color: var(--alertPopupNeutralText, $fallback--text); color: var(--alertPopupNeutralText, $fallback--text);
i { .svg-inline--fa {
color: var(--alertPopupNeutralText, $fallback--text); color: var(--alertPopupNeutralText, $fallback--text);
} }
} }
.close-notice {
padding-right: 0.2em;
.svg-inline--fa:hover {
opacity: 0.6;
}
}
} }
</style> </style>

View file

@ -0,0 +1,36 @@
import { extractTagFromUrl } from 'src/services/matcher/matcher.service.js'
const HashtagLink = {
name: 'HashtagLink',
props: {
url: {
required: true,
type: String
},
content: {
required: true,
type: String
},
tag: {
required: false,
type: String,
default: ''
}
},
methods: {
onClick () {
const tag = this.tag || extractTagFromUrl(this.url)
if (tag) {
const link = this.generateTagLink(tag)
this.$router.push(link)
} else {
window.open(this.url, '_blank')
}
},
generateTagLink (tag) {
return `/tag/${tag}`
}
}
}
export default HashtagLink

View file

@ -0,0 +1,6 @@
.HashtagLink {
position: relative;
white-space: normal;
display: inline-block;
color: var(--link);
}

View file

@ -0,0 +1,19 @@
<template>
<span
class="HashtagLink"
>
<!-- eslint-disable vue/no-v-html -->
<a
:href="url"
class="original"
target="_blank"
@click.prevent="onClick"
v-html="content"
/>
<!-- eslint-enable vue/no-v-html -->
</span>
</template>
<script src="./hashtag_link.js"/>
<style lang="scss" src="./hashtag_link.scss"/>

Some files were not shown because too many files have changed in this diff Show more