Merge remote-tracking branch 'origin/develop' into shigusegubu-themes3
This commit is contained in:
commit
4d17aaaad6
21 changed files with 173 additions and 79 deletions
36
.woodpecker/build-package.yaml
Normal file
36
.woodpecker/build-package.yaml
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
- event: manual
|
||||||
|
branch: ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- test
|
||||||
|
- test-e2e
|
||||||
|
|
||||||
|
labels:
|
||||||
|
platform: linux/amd64
|
||||||
|
memory: 'high'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
build:
|
||||||
|
image: docker.io/node:20-alpine
|
||||||
|
commands:
|
||||||
|
- apk add --no-cache zip git
|
||||||
|
- yarn --frozen-lockfile
|
||||||
|
- yarn build
|
||||||
|
- if [ "${CI_PIPELINE_EVENT}" = "push" ] || [ "${CI_PIPELINE_EVENT}" = "manual" ]; then zip -9qr ${CI_REPO_DEFAULT_BRANCH}.zip dist/; fi
|
||||||
|
|
||||||
|
upload-artifacts:
|
||||||
|
image: docker.io/woodpeckercommunity/plugin-gitea-package:0.5.0
|
||||||
|
settings:
|
||||||
|
user:
|
||||||
|
from_secret: pleroma-ci-user
|
||||||
|
password:
|
||||||
|
from_secret: pleroma-ci-password
|
||||||
|
update: true
|
||||||
|
owner: 'pleroma'
|
||||||
|
package_name: 'pleroma-fe-builds'
|
||||||
|
package_version: ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
file_source: ./${CI_REPO_DEFAULT_BRANCH}.zip
|
||||||
|
file_name: latest.zip
|
||||||
|
|
@ -6,38 +6,12 @@ when:
|
||||||
- event: manual
|
- event: manual
|
||||||
branch: ${CI_REPO_DEFAULT_BRANCH}
|
branch: ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
depends_on:
|
|
||||||
- test
|
|
||||||
- test-e2e
|
|
||||||
|
|
||||||
labels:
|
labels:
|
||||||
platform: linux/amd64
|
platform: linux/amd64
|
||||||
memory: 'high'
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
build:
|
build:
|
||||||
image: docker.io/node:20-alpine
|
image: docker.io/node:20-alpine
|
||||||
commands:
|
commands:
|
||||||
- apk add --no-cache zip git
|
|
||||||
- yarn --frozen-lockfile
|
- yarn --frozen-lockfile
|
||||||
- yarn build
|
- yarn build
|
||||||
- if [ "${CI_PIPELINE_EVENT}" = "push" ] || [ "${CI_PIPELINE_EVENT}" = "manual" ]; then zip -9qr ${CI_REPO_DEFAULT_BRANCH}.zip dist/; fi
|
|
||||||
|
|
||||||
upload-artifacts:
|
|
||||||
image: docker.io/woodpeckercommunity/plugin-gitea-package:0.5.0
|
|
||||||
when:
|
|
||||||
- event: push
|
|
||||||
branch: ${CI_REPO_DEFAULT_BRANCH}
|
|
||||||
- event: manual
|
|
||||||
branch: ${CI_REPO_DEFAULT_BRANCH}
|
|
||||||
settings:
|
|
||||||
user:
|
|
||||||
from_secret: pleroma-ci-user
|
|
||||||
password:
|
|
||||||
from_secret: pleroma-ci-password
|
|
||||||
update: true
|
|
||||||
owner: 'pleroma'
|
|
||||||
package_name: 'pleroma-fe-builds'
|
|
||||||
package_version: ${CI_REPO_DEFAULT_BRANCH}
|
|
||||||
file_source: ./${CI_REPO_DEFAULT_BRANCH}.zip
|
|
||||||
file_name: latest.zip
|
|
||||||
|
|
|
||||||
45
.woodpecker/code-analisys.yaml
Normal file
45
.woodpecker/code-analisys.yaml
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
- event: manual
|
||||||
|
branch: ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
labels:
|
||||||
|
platform: linux/amd64
|
||||||
|
memory: 'high'
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
- test-e2e
|
||||||
|
|
||||||
|
clone:
|
||||||
|
- name: git
|
||||||
|
image: woodpeckerci/plugin-git
|
||||||
|
settings:
|
||||||
|
depth: 0
|
||||||
|
partial: false
|
||||||
|
|
||||||
|
variables:
|
||||||
|
script_file_entrypoint: &script_file_entrypoint
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- 'printf "%s" "$CI_SCRIPT" | base64 -d > /tmp/ci-script.sh && /bin/sh -xe /tmp/ci-script.sh'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
generate-coverage:
|
||||||
|
image: mcr.microsoft.com/playwright:v1.61.0-jammy
|
||||||
|
environment:
|
||||||
|
FF_NETWORK_PER_BUILD: "true"
|
||||||
|
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1"
|
||||||
|
entrypoint: *script_file_entrypoint
|
||||||
|
commands:
|
||||||
|
- yarn --frozen-lockfile
|
||||||
|
- yarn unit-ci-coverage
|
||||||
|
|
||||||
|
code-analysis:
|
||||||
|
image: sonarsource/sonar-scanner-cli:11
|
||||||
|
environment:
|
||||||
|
SONAR_TOKEN:
|
||||||
|
from_secret: sonarqube-token
|
||||||
|
entrypoint: sonar-scanner
|
||||||
|
|
@ -10,6 +10,10 @@ labels:
|
||||||
platform: linux/amd64
|
platform: linux/amd64
|
||||||
memory: 'high'
|
memory: 'high'
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
artifacts_uploader_settings: &artifacts_uploader_settings
|
artifacts_uploader_settings: &artifacts_uploader_settings
|
||||||
user:
|
user:
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,9 @@ labels:
|
||||||
platform: linux/amd64
|
platform: linux/amd64
|
||||||
memory: 'high'
|
memory: 'high'
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- build
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
artifacts_uploader_settings: &artifacts_uploader_settings
|
artifacts_uploader_settings: &artifacts_uploader_settings
|
||||||
user:
|
user:
|
||||||
|
|
@ -45,20 +48,6 @@ steps:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
code-analysis:
|
|
||||||
image: sonarsource/sonar-scanner-cli:11
|
|
||||||
when:
|
|
||||||
- event: push
|
|
||||||
branch: ${CI_REPO_DEFAULT_BRANCH}
|
|
||||||
- event: manual
|
|
||||||
branch: ${CI_REPO_DEFAULT_BRANCH}
|
|
||||||
environment:
|
|
||||||
SONAR_TOKEN:
|
|
||||||
from_secret: sonarqube-token
|
|
||||||
entrypoint: *script_file_entrypoint
|
|
||||||
commands:
|
|
||||||
- sonar-scanner
|
|
||||||
|
|
||||||
upload-artifacts:
|
upload-artifacts:
|
||||||
image: docker.io/woodpeckercommunity/plugin-gitea-package:0.5.0
|
image: docker.io/woodpeckercommunity/plugin-gitea-package:0.5.0
|
||||||
when:
|
when:
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
[](https://ci.pleroma.com/repos/2) [](https://sonarqube.pleroma.dev/dashboard?id=Pleroma-FE) [](https://sonarqube.pleroma.dev/dashboard?id=Pleroma-FE) [](https://sonarqube.pleroma.dev/dashboard?id=Pleroma-FE) [](https://sonarqube.pleroma.dev/dashboard?id=Pleroma-FE) <a href="https://translate.pleroma.social/engage/pleroma/"><img src="https://translate.pleroma.social/widget/pleroma/pleroma-fe/svg-badge.svg" alt="Translation status"></a>
|
||||||
|
|
||||||
# For Translators
|
# For Translators
|
||||||
|
|
||||||
To translate Pleroma-FE, use our weblate server: https://translate.pleroma.social/. If you need to add your language it should be added as a json file in [src/i18n/](https://git.pleroma.social/pleroma/pleroma-fe/src/src/i18n/) folder and added in a list within [src/i18n/languages.js](https://git.pleroma.social/pleroma/pleroma-fe/src/src/i18n/languages.js).
|
To translate Pleroma-FE, use our weblate server: https://translate.pleroma.social/. If you need to add your language it should be added as a json file in [src/i18n/](https://git.pleroma.social/pleroma/pleroma-fe/src/src/i18n/) folder and added in a list within [src/i18n/languages.js](https://git.pleroma.social/pleroma/pleroma-fe/src/src/i18n/languages.js).
|
||||||
|
|
@ -32,9 +34,14 @@ yarn unit
|
||||||
|
|
||||||
# For Contributors:
|
# For Contributors:
|
||||||
|
|
||||||
|
You can make local build proxy requests to specific instance with an environment variable `VITE_PROXY_TARGET`, generally it is a good idea to also set port for that specific proxy, if you intend on testing multiple instances, i.e.:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn && PORT=8080 VITE_PROXY_TARGET=https://coolinstance.tld yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
You can create file `/config/local.json` (see [example](https://git.pleroma.social/pleroma/pleroma-fe/src/config/local.example.json)) to enable some convenience dev options:
|
You can create file `/config/local.json` (see [example](https://git.pleroma.social/pleroma/pleroma-fe/src/config/local.example.json)) to enable some convenience dev options:
|
||||||
|
|
||||||
* `target`: makes local dev server redirect to some existing instance's BE instead of local BE, useful for testing things in near-production environment and searching for real-life use-cases.
|
|
||||||
* `staticConfigPreference`: makes FE's `/static/config.json` take preference of BE-served `/api/pleroma/frontend_configurations`. Only works in dev mode.
|
* `staticConfigPreference`: makes FE's `/static/config.json` take preference of BE-served `/api/pleroma/frontend_configurations`. Only works in dev mode.
|
||||||
|
|
||||||
FE Build process also leaves current commit hash in global variable `___pleromafe_commit_hash` so that you can easily see which pleroma-fe commit instance is running, also helps pinpointing which commit was used when FE was bundled into BE.
|
FE Build process also leaves current commit hash in global variable `___pleromafe_commit_hash` so that you can easily see which pleroma-fe commit instance is running, also helps pinpointing which commit was used when FE was bundled into BE.
|
||||||
|
|
|
||||||
1
changelog.d/avatar_upload.fix
Normal file
1
changelog.d/avatar_upload.fix
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
fix image cropper error preventing avatar upload
|
||||||
1
changelog.d/third_column.fix
Normal file
1
changelog.d/third_column.fix
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed layout selector (third column/reverse) not working immideately upon change
|
||||||
|
|
@ -8,7 +8,8 @@
|
||||||
"dev": "node build/update-emoji.js && vite dev",
|
"dev": "node build/update-emoji.js && vite dev",
|
||||||
"build": "node build/update-emoji.js && vite build",
|
"build": "node build/update-emoji.js && vite build",
|
||||||
"unit": "node build/update-emoji.js && vitest --run --coverage",
|
"unit": "node build/update-emoji.js && vitest --run --coverage",
|
||||||
"unit-ci": "node build/update-emoji.js && vitest --run --coverage --browser.headless",
|
"unit-ci": "node build/update-emoji.js && vitest --run --browser.headless",
|
||||||
|
"unit-ci-coverage": "node build/update-emoji.js && vitest --run --coverage --browser.headless",
|
||||||
"unit:watch": "node build/update-emoji.js && vitest --coverage",
|
"unit:watch": "node build/update-emoji.js && vitest --coverage",
|
||||||
"e2e:pw": "playwright test --config test/e2e-playwright/playwright.config.mjs",
|
"e2e:pw": "playwright test --config test/e2e-playwright/playwright.config.mjs",
|
||||||
"e2e": "sh ./tools/e2e/run.sh",
|
"e2e": "sh ./tools/e2e/run.sh",
|
||||||
|
|
|
||||||
27
src/App.js
27
src/App.js
|
|
@ -74,6 +74,8 @@ export default {
|
||||||
},
|
},
|
||||||
data: () => ({
|
data: () => ({
|
||||||
mobileActivePanel: 'timeline',
|
mobileActivePanel: 'timeline',
|
||||||
|
updateMobileState: null,
|
||||||
|
updateScrollState: null,
|
||||||
}),
|
}),
|
||||||
provide() {
|
provide() {
|
||||||
return {
|
return {
|
||||||
|
|
@ -211,31 +213,32 @@ export default {
|
||||||
hideShoutbox() {
|
hideShoutbox() {
|
||||||
return this.isChats || useMergedConfigStore().mergedConfig.hideShoutbox
|
return this.isChats || useMergedConfigStore().mergedConfig.hideShoutbox
|
||||||
},
|
},
|
||||||
|
thirdColumnMode() {
|
||||||
|
return this.mergedConfig.thirdColumnMode
|
||||||
|
},
|
||||||
|
reverseSetting() {
|
||||||
|
return this.mergedConfig.sidebarRight
|
||||||
|
},
|
||||||
reverseLayout() {
|
reverseLayout() {
|
||||||
const { thirdColumnMode, sidebarRight: reverseSetting } =
|
|
||||||
useMergedConfigStore().mergedConfig
|
|
||||||
if (this.layoutType !== 'wide') {
|
if (this.layoutType !== 'wide') {
|
||||||
return reverseSetting
|
return this.reverseSetting
|
||||||
} else {
|
} else {
|
||||||
return thirdColumnMode === 'notifications'
|
return this.thirdColumnMode === 'notifications'
|
||||||
? reverseSetting
|
? this.reverseSetting
|
||||||
: !reverseSetting
|
: !this.reverseSetting
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
noSticky() {
|
noSticky() {
|
||||||
return useMergedConfigStore().mergedConfig.disableStickyHeaders
|
return this.mergedConfig.disableStickyHeaders
|
||||||
},
|
},
|
||||||
showScrollbars() {
|
showScrollbars() {
|
||||||
return useMergedConfigStore().mergedConfig.showScrollbars
|
return this.mergedConfig.showScrollbars
|
||||||
},
|
},
|
||||||
scrollParent() {
|
scrollParent() {
|
||||||
return window /* this.$refs.appContentRef */
|
return window /* this.$refs.appContentRef */
|
||||||
},
|
},
|
||||||
showInstanceSpecificPanel() {
|
showInstanceSpecificPanel() {
|
||||||
return (
|
return this.instanceSpecificPanelPresent && !this.mergedConfig.hideISP
|
||||||
this.instanceSpecificPanelPresent &&
|
|
||||||
!useMergedConfigStore().mergedConfig.hideISP
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
...mapState(useMergedConfigStore, ['mergedConfig']),
|
...mapState(useMergedConfigStore, ['mergedConfig']),
|
||||||
...mapState(useInterfaceStore, [
|
...mapState(useInterfaceStore, [
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,9 @@ const ImageCropper = {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
onCropperSelectionChange(event) {
|
onCropperSelectionChange(event) {
|
||||||
|
if (!this.$refs.cropperCanvas) {
|
||||||
|
return // Cropper sends even before component is fully initialized
|
||||||
|
}
|
||||||
const cropperCanvas = this.$refs.cropperCanvas
|
const cropperCanvas = this.$refs.cropperCanvas
|
||||||
const cropperCanvasRect = cropperCanvas.getBoundingClientRect()
|
const cropperCanvasRect = cropperCanvas.getBoundingClientRect()
|
||||||
const selection = event.detail
|
const selection = event.detail
|
||||||
|
|
|
||||||
|
|
@ -134,12 +134,11 @@ const Notifications = {
|
||||||
return this.minimalMode || layoutType === 'mobile'
|
return this.minimalMode || layoutType === 'mobile'
|
||||||
},
|
},
|
||||||
teleportTarget() {
|
teleportTarget() {
|
||||||
const { layoutType } = useInterfaceStore()
|
|
||||||
const map = {
|
const map = {
|
||||||
wide: '#notifs-column',
|
wide: '#notifs-column',
|
||||||
mobile: '#mobile-notifications',
|
mobile: '#mobile-notifications',
|
||||||
}
|
}
|
||||||
return map[layoutType] || '#notifs-sidebar'
|
return map[this.layoutType] || '#notifs-sidebar'
|
||||||
},
|
},
|
||||||
popoversZLayer() {
|
popoversZLayer() {
|
||||||
const { layoutType } = useInterfaceStore()
|
const { layoutType } = useInterfaceStore()
|
||||||
|
|
@ -162,6 +161,7 @@ const Notifications = {
|
||||||
},
|
},
|
||||||
...mapState(useAnnouncementsStore, ['unreadAnnouncementCount']),
|
...mapState(useAnnouncementsStore, ['unreadAnnouncementCount']),
|
||||||
...mapState(useChatsStore, ['unreadChatsCount']),
|
...mapState(useChatsStore, ['unreadChatsCount']),
|
||||||
|
...mapState(useInterfaceStore, ['layoutType']),
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.scrollerRef = this.$refs.root.closest('.column.-scrollable')
|
this.scrollerRef = this.$refs.root.closest('.column.-scrollable')
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ export default {
|
||||||
},
|
},
|
||||||
emits: ['update:modelValue'],
|
emits: ['update:modelValue'],
|
||||||
computed: {
|
computed: {
|
||||||
|
// Model value
|
||||||
|
options() {
|
||||||
|
return pollFallback(this.modelValue, 'options')
|
||||||
|
},
|
||||||
pollType: {
|
pollType: {
|
||||||
get() {
|
get() {
|
||||||
return pollFallback(this.modelValue, 'pollType')
|
return pollFallback(this.modelValue, 'pollType')
|
||||||
|
|
@ -36,14 +40,6 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
options: {
|
|
||||||
get() {
|
|
||||||
return pollFallback(this.modelValue, 'options')
|
|
||||||
},
|
|
||||||
set(newVal) {
|
|
||||||
this.$emit('update:modelValue', { ...this.modelValue, options: newVal })
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expiryAmount: {
|
expiryAmount: {
|
||||||
get() {
|
get() {
|
||||||
return pollFallback(this.modelValue, 'expiryAmount')
|
return pollFallback(this.modelValue, 'expiryAmount')
|
||||||
|
|
@ -66,6 +62,8 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Configuration
|
||||||
pollLimits() {
|
pollLimits() {
|
||||||
return useInstanceStore().limits.pollLimits
|
return useInstanceStore().limits.pollLimits
|
||||||
},
|
},
|
||||||
|
|
@ -116,19 +114,34 @@ export default {
|
||||||
},
|
},
|
||||||
addOption() {
|
addOption() {
|
||||||
if (this.options.length < this.maxOptions) {
|
if (this.options.length < this.maxOptions) {
|
||||||
this.options = [...this.options, '']
|
this.$emit('update:modelValue', {
|
||||||
|
...this.modelValue,
|
||||||
|
options: [...this.options, ''],
|
||||||
|
})
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
deleteOption(index) {
|
deleteOption(index) {
|
||||||
if (this.options.length > 2) {
|
if (this.options.length > 2) {
|
||||||
this.options.splice(index, 1)
|
const options = [...this.options]
|
||||||
this.options = this.options
|
options.splice(index, 1)
|
||||||
|
|
||||||
|
this.$emit('update:modelValue', {
|
||||||
|
...this.modelValue,
|
||||||
|
options,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
updateOption(index, value) {
|
updateOption(index, value) {
|
||||||
this.options = this.options
|
const options = [...this.options]
|
||||||
|
options[index] = value
|
||||||
|
|
||||||
|
this.$emit('update:modelValue', {
|
||||||
|
...this.modelValue,
|
||||||
|
options,
|
||||||
|
})
|
||||||
},
|
},
|
||||||
convertExpiryToUnit(unit, amount) {
|
convertExpiryToUnit(unit, amount) {
|
||||||
// Note: we want seconds and not milliseconds
|
// Note: we want seconds and not milliseconds
|
||||||
|
|
|
||||||
|
|
@ -11,14 +11,15 @@
|
||||||
<div class="input-container">
|
<div class="input-container">
|
||||||
<input
|
<input
|
||||||
:id="`poll-${index}`"
|
:id="`poll-${index}`"
|
||||||
v-model="options[index]"
|
:model-value="options[index]"
|
||||||
size="1"
|
size="1"
|
||||||
class="input poll-option-input"
|
class="input poll-option-input"
|
||||||
type="text"
|
type="text"
|
||||||
:placeholder="$t('polls.option')"
|
:placeholder="$t('polls.option')"
|
||||||
:maxlength="maxLength"
|
:maxlength="maxLength"
|
||||||
|
:aria-label="$t('polls.option')"
|
||||||
@keydown.enter.stop.prevent="nextOption(index)"
|
@keydown.enter.stop.prevent="nextOption(index)"
|
||||||
@change="updateOption"
|
@change="(e) => updateOption(index, e.target.value)"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
|
|
@ -69,6 +70,7 @@
|
||||||
class="input expiry-amount hide-number-spinner"
|
class="input expiry-amount hide-number-spinner"
|
||||||
:min="minExpirationInCurrentUnit"
|
:min="minExpirationInCurrentUnit"
|
||||||
:max="maxExpirationInCurrentUnit"
|
:max="maxExpirationInCurrentUnit"
|
||||||
|
:aria-label="$t('polls.expiry_amount')"
|
||||||
@change="expiryAmountChange"
|
@change="expiryAmountChange"
|
||||||
>
|
>
|
||||||
{{ ' ' }}
|
{{ ' ' }}
|
||||||
|
|
@ -77,6 +79,7 @@
|
||||||
unstyled="true"
|
unstyled="true"
|
||||||
class="expiry-unit"
|
class="expiry-unit"
|
||||||
@change="expiryAmountChange"
|
@change="expiryAmountChange"
|
||||||
|
:aria-label="$t('polls.expiry_unit')"
|
||||||
>
|
>
|
||||||
<option
|
<option
|
||||||
v-for="unit in expiryUnits"
|
v-for="unit in expiryUnits"
|
||||||
|
|
|
||||||
|
|
@ -378,8 +378,8 @@ const PostStatusForm = {
|
||||||
set(value) {
|
set(value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
this.newStatus.quote = {}
|
this.newStatus.quote = {}
|
||||||
this.newStatus.quote.thread = value
|
this.newStatus.quote.thread = true
|
||||||
this.newStatus.quote.id = value ? this.repliedStatus.id : ''
|
this.newStatus.quote.id = this.repliedStatus.id
|
||||||
} else {
|
} else {
|
||||||
this.newStatus.quote = null
|
this.newStatus.quote = null
|
||||||
}
|
}
|
||||||
|
|
@ -509,9 +509,7 @@ const PostStatusForm = {
|
||||||
|
|
||||||
// Error handling
|
// Error handling
|
||||||
pollContentError() {
|
pollContentError() {
|
||||||
return (
|
return this.pollFormVisible && this.newStatus.poll?.error
|
||||||
this.pollFormVisible && this.newStatus.poll && this.newStatus.poll.error
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Featureset detection
|
// Featureset detection
|
||||||
|
|
@ -959,6 +957,7 @@ const PostStatusForm = {
|
||||||
// Quote
|
// Quote
|
||||||
toggleQuoteForm() {
|
toggleQuoteForm() {
|
||||||
// This is for the "attach quote" button
|
// This is for the "attach quote" button
|
||||||
|
if (this.newStatus.quote?.thread) return
|
||||||
if (!this.hasQuote) {
|
if (!this.hasQuote) {
|
||||||
this.newStatus.quote = {}
|
this.newStatus.quote = {}
|
||||||
this.newStatus.quote.thread = false
|
this.newStatus.quote.thread = false
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@
|
||||||
ref="scopeSelector"
|
ref="scopeSelector"
|
||||||
:show-all="showAllScopes"
|
:show-all="showAllScopes"
|
||||||
:user-default="userDefaultScope"
|
:user-default="userDefaultScope"
|
||||||
:original-scope="newStatus.visibility"
|
:original-scope="repliedStatus?.visibility"
|
||||||
:initial-scope="newStatus.visibility"
|
:initial-scope="newStatus.visibility"
|
||||||
@change="changeVis"
|
@change="changeVis"
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
size="1"
|
size="1"
|
||||||
class="input"
|
class="input"
|
||||||
:placeholder="$t('post_status.quote_url')"
|
:placeholder="$t('post_status.quote_url')"
|
||||||
|
:aria-label="$t('post_status.quote_url')"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<Quote
|
<Quote
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,7 @@ export default {
|
||||||
localDraft: null,
|
localDraft: null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
emits: ['update:modelValue'],
|
||||||
created() {
|
created() {
|
||||||
if (
|
if (
|
||||||
this.realDraftMode &&
|
this.realDraftMode &&
|
||||||
|
|
@ -244,7 +245,9 @@ export default {
|
||||||
},
|
},
|
||||||
configSink() {
|
configSink() {
|
||||||
if (this.path == null) {
|
if (this.path == null) {
|
||||||
return (k, v) => this.$emit('update:modelValue', v)
|
return () => {
|
||||||
|
/* no-op */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (this.realSource) {
|
switch (this.realSource) {
|
||||||
|
|
@ -385,11 +388,13 @@ export default {
|
||||||
if (this.realDraftMode) {
|
if (this.realDraftMode) {
|
||||||
this.draft = this.getValue(e)
|
this.draft = this.getValue(e)
|
||||||
} else {
|
} else {
|
||||||
|
this.$emit('update:modelValue', this.getValue(e))
|
||||||
this.configSink(this.path, this.getValue(e))
|
this.configSink(this.path, this.getValue(e))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
commitDraft() {
|
commitDraft() {
|
||||||
if (this.realDraftMode) {
|
if (this.realDraftMode) {
|
||||||
|
this.$emit('update:modelValue', this.draft)
|
||||||
this.configSink(this.path, this.draft)
|
this.configSink(this.path, this.draft)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import SharedComputedObject from '../helpers/shared_computed_object.js'
|
||||||
import UnitSetting from '../helpers/unit_setting.vue'
|
import UnitSetting from '../helpers/unit_setting.vue'
|
||||||
|
|
||||||
import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js'
|
import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js'
|
||||||
|
import { useInterfaceStore } from 'src/stores/interface.js'
|
||||||
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
|
|
||||||
const GeneralTab = {
|
const GeneralTab = {
|
||||||
|
|
@ -46,6 +47,11 @@ const GeneralTab = {
|
||||||
},
|
},
|
||||||
...SharedComputedObject(),
|
...SharedComputedObject(),
|
||||||
},
|
},
|
||||||
|
methods: {
|
||||||
|
updateLayout() {
|
||||||
|
useInterfaceStore().setLayoutWidth()
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export default GeneralTab
|
export default GeneralTab
|
||||||
|
|
|
||||||
|
|
@ -105,6 +105,7 @@
|
||||||
id="thirdColumnMode"
|
id="thirdColumnMode"
|
||||||
path="thirdColumnMode"
|
path="thirdColumnMode"
|
||||||
:options="thirdColumnModeOptions"
|
:options="thirdColumnModeOptions"
|
||||||
|
@change="updateLayout"
|
||||||
>
|
>
|
||||||
{{ $t('settings.third_column_mode') }}
|
{{ $t('settings.third_column_mode') }}
|
||||||
</ChoiceSetting>
|
</ChoiceSetting>
|
||||||
|
|
|
||||||
|
|
@ -242,6 +242,8 @@
|
||||||
"single_choice": "Single choice",
|
"single_choice": "Single choice",
|
||||||
"multiple_choices": "Multiple choices",
|
"multiple_choices": "Multiple choices",
|
||||||
"expiry": "Poll age",
|
"expiry": "Poll age",
|
||||||
|
"expiry_unit": "Expiry unit",
|
||||||
|
"expiry_amount": "Expiry amount",
|
||||||
"expires_at": "Poll ends {0}",
|
"expires_at": "Poll ends {0}",
|
||||||
"expires_in": "Poll ends in {0}",
|
"expires_in": "Poll ends in {0}",
|
||||||
"expired": "Poll ended {0} ago",
|
"expired": "Poll ended {0} ago",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue