Merge remote-tracking branch 'origin/develop' into shigusegubu-themes3

This commit is contained in:
Henry Jameson 2025-08-10 23:39:43 +03:00
commit eef6f6d0e2
9 changed files with 487 additions and 265 deletions

View file

@ -0,0 +1 @@
Added a way to upload new packs from a URL or ZIP file via the admin-fe

View file

@ -17,7 +17,7 @@
"lint-fix": "eslint --fix src test/unit/specs test/e2e/specs" "lint-fix": "eslint --fix src test/unit/specs test/e2e/specs"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "7.27.1", "@babel/runtime": "7.28.2",
"@chenfengyuan/vue-qrcode": "2.0.0", "@chenfengyuan/vue-qrcode": "2.0.0",
"@fortawesome/fontawesome-svg-core": "6.7.2", "@fortawesome/fontawesome-svg-core": "6.7.2",
"@fortawesome/free-regular-svg-icons": "6.7.2", "@fortawesome/free-regular-svg-icons": "6.7.2",
@ -54,10 +54,10 @@
"vuex": "4.1.0" "vuex": "4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.27.1", "@babel/core": "7.28.0",
"@babel/eslint-parser": "7.27.1", "@babel/eslint-parser": "7.28.0",
"@babel/plugin-transform-runtime": "7.27.1", "@babel/plugin-transform-runtime": "7.28.0",
"@babel/preset-env": "7.27.2", "@babel/preset-env": "7.28.0",
"@babel/register": "7.27.1", "@babel/register": "7.27.1",
"@ungap/event-target": "0.2.4", "@ungap/event-target": "0.2.4",
"@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue": "^5.2.1",
@ -70,13 +70,13 @@
"@vue/test-utils": "2.4.6", "@vue/test-utils": "2.4.6",
"autoprefixer": "10.4.21", "autoprefixer": "10.4.21",
"babel-plugin-lodash": "3.3.4", "babel-plugin-lodash": "3.3.4",
"chai": "5.2.0", "chai": "5.2.1",
"chalk": "5.4.1", "chalk": "5.4.1",
"chromedriver": "135.0.4", "chromedriver": "135.0.4",
"connect-history-api-fallback": "2.0.0", "connect-history-api-fallback": "2.0.0",
"cross-spawn": "7.0.6", "cross-spawn": "7.0.6",
"custom-event-polyfill": "1.0.7", "custom-event-polyfill": "1.0.7",
"eslint": "9.26.0", "eslint": "9.33.0",
"vue-eslint-parser": "10.1.3", "vue-eslint-parser": "10.1.3",
"eslint-config-standard": "17.1.0", "eslint-config-standard": "17.1.0",
"eslint-formatter-friendly": "7.0.0", "eslint-formatter-friendly": "7.0.0",
@ -91,9 +91,9 @@
"iso-639-1": "3.1.5", "iso-639-1": "3.1.5",
"lodash": "4.17.21", "lodash": "4.17.21",
"msw": "2.10.2", "msw": "2.10.2",
"nightwatch": "3.12.1", "nightwatch": "3.12.2",
"playwright": "1.52.0", "playwright": "1.52.0",
"postcss": "8.5.3", "postcss": "8.5.6",
"postcss-html": "^1.5.0", "postcss-html": "^1.5.0",
"postcss-scss": "^4.0.6", "postcss-scss": "^4.0.6",
"sass": "1.89.2", "sass": "1.89.2",

View file

@ -32,7 +32,10 @@ const EmojiTab = {
newPackName: '', newPackName: '',
deleteModalVisible: false, deleteModalVisible: false,
remotePackInstance: '', remotePackInstance: '',
remotePackDownloadAs: '' remotePackDownloadAs: '',
remotePackURL: '',
remotePackFile: null
} }
}, },
@ -220,7 +223,7 @@ const EmojiTab = {
.then(data => data.json()) .then(data => data.json())
.then(resp => { .then(resp => {
if (resp === 'ok') { if (resp === 'ok') {
this.$refs.dlPackPopover.hidePopover() this.$refs.downloadPackPopover.hidePopover()
return this.refreshPackList() return this.refreshPackList()
} else { } else {
@ -232,6 +235,47 @@ const EmojiTab = {
this.remotePackDownloadAs = '' this.remotePackDownloadAs = ''
}) })
}, },
downloadRemoteURLPack () {
this.$store.state.api.backendInteractor.downloadRemoteEmojiPackZIP({
url: this.remotePackURL, packName: this.newPackName
})
.then(data => data.json())
.then(resp => {
if (resp === 'ok') {
this.$refs.additionalRemotePopover.hidePopover()
return this.refreshPackList()
} else {
this.displayError(resp.error)
return Promise.reject(resp)
}
}).then(() => {
this.packName = this.newPackName
this.newPackName = ''
this.remotePackURL = ''
})
},
downloadRemoteFilePack () {
this.$store.state.api.backendInteractor.downloadRemoteEmojiPackZIP({
file: this.remotePackFile[0], packName: this.newPackName
})
.then(data => data.json())
.then(resp => {
if (resp === 'ok') {
this.$refs.additionalRemotePopover.hidePopover()
return this.refreshPackList()
} else {
this.displayError(resp.error)
return Promise.reject(resp)
}
}).then(() => {
this.packName = this.newPackName
this.newPackName = ''
this.remotePackURL = ''
})
},
displayError (msg) { displayError (msg) {
useInterfaceStore().pushGlobalNotice({ useInterfaceStore().pushGlobalNotice({
messageKey: 'admin_dash.emoji.error', messageKey: 'admin_dash.emoji.error',

View file

@ -62,6 +62,64 @@
</template> </template>
</Popover> </Popover>
</button> </button>
<button
class="button button-default emoji-panel-additional-actions"
@click="$refs.additionalRemotePopover.showPopover"
>
<FAIcon
icon="chevron-down"
/>
<Popover
ref="additionalRemotePopover"
popover-class="emoji-tab-edit-popover popover-default"
trigger="click"
placement="bottom"
bound-to-selector=".emoji-tab"
:bound-to="{ x: 'container' }"
:offset="{ y: 5 }"
>
<template #content>
<div class="emoji-tab-popover-input">
<h3>{{ $t('admin_dash.emoji.new_pack_name') }}</h3>
<input
v-model="newPackName"
:placeholder="$t('admin_dash.emoji.new_pack_name')"
class="input"
>
<h3>Import pack from URL</h3>
<input
v-model="remotePackURL"
class="input"
placeholder="Pack .zip URL"
>
<button
class="button button-default btn emoji-tab-popover-button"
type="button"
:disabled="newPackName.trim() === '' || remotePackURL.trim() === ''"
@click="downloadRemoteURLPack"
>
Import
</button>
<h3>Import pack from a file</h3>
<input
type="file"
accept="application/zip"
class="emoji-tab-popover-file input"
@change="remotePackFile = $event.target.files"
>
<button
class="button button-default btn emoji-tab-popover-button"
type="button"
:disabled="newPackName.trim() === '' || remotePackFile === null || remotePackFile.length === 0"
@click="downloadRemoteFilePack"
>
Import
</button>
</div>
</template>
</Popover>
</button>
</li> </li>
<h3>{{ $t('admin_dash.emoji.emoji_packs') }}</h3> <h3>{{ $t('admin_dash.emoji.emoji_packs') }}</h3>
@ -240,12 +298,12 @@
v-if="pack.remote !== undefined" v-if="pack.remote !== undefined"
class="button button-default btn" class="button button-default btn"
type="button" type="button"
@click="$refs.dlPackPopover.showPopover" @click="$refs.downloadPackPopover.showPopover"
> >
{{ $t('admin_dash.emoji.download_pack') }} {{ $t('admin_dash.emoji.download_pack') }}
<Popover <Popover
ref="dlPackPopover" ref="downloadPackPopover"
trigger="click" trigger="click"
placement="bottom" placement="bottom"
bound-to-selector=".emoji-tab" bound-to-selector=".emoji-tab"

View file

@ -423,11 +423,6 @@
--emoji-size: 1.8em; --emoji-size: 1.8em;
img {
object-fit: contain;
vertical-align: middle;
}
.user-profile-field-add, .user-profile-field-add,
.user-profile-field { .user-profile-field {
display: flex; display: flex;

View file

@ -458,7 +458,8 @@
> >
<template #default="inputProps"> <template #default="inputProps">
<input <input
v-model="newFields[i].name" :placeholder="$t('settings.profile_fields.name')" v-model="newFields[i].name"
:placeholder="$t('settings.profile_fields.name')"
v-bind="propsToNative(inputProps)" v-bind="propsToNative(inputProps)"
class="input" class="input"
> >

View file

@ -122,6 +122,7 @@ const PLEROMA_EMOJI_IMPORT_FS_URL = '/api/pleroma/emoji/packs/import'
const PLEROMA_EMOJI_PACKS_URL = (page, pageSize) => `/api/v1/pleroma/emoji/packs?page=${page}&page_size=${pageSize}` const PLEROMA_EMOJI_PACKS_URL = (page, pageSize) => `/api/v1/pleroma/emoji/packs?page=${page}&page_size=${pageSize}`
const PLEROMA_EMOJI_PACK_URL = (name) => `/api/v1/pleroma/emoji/pack?name=${name}` const PLEROMA_EMOJI_PACK_URL = (name) => `/api/v1/pleroma/emoji/pack?name=${name}`
const PLEROMA_EMOJI_PACKS_DL_REMOTE_URL = '/api/v1/pleroma/emoji/packs/download' const PLEROMA_EMOJI_PACKS_DL_REMOTE_URL = '/api/v1/pleroma/emoji/packs/download'
const PLEROMA_EMOJI_PACKS_DL_REMOTE_ZIP_URL = '/api/v1/pleroma/emoji/packs/download_zip'
const PLEROMA_EMOJI_PACKS_LS_REMOTE_URL = const PLEROMA_EMOJI_PACKS_LS_REMOTE_URL =
(url, page, pageSize) => `/api/v1/pleroma/emoji/packs/remote?url=${url}&page=${page}&page_size=${pageSize}` (url, page, pageSize) => `/api/v1/pleroma/emoji/packs/remote?url=${url}&page=${page}&page_size=${pageSize}`
const PLEROMA_EMOJI_UPDATE_FILE_URL = (name) => `/api/v1/pleroma/emoji/packs/files?name=${name}` const PLEROMA_EMOJI_UPDATE_FILE_URL = (name) => `/api/v1/pleroma/emoji/packs/files?name=${name}`
@ -224,6 +225,9 @@ const updateProfile = ({ credentials, params }) => {
formData.append(name + `[${i}][value]`, param.value) formData.append(name + `[${i}][value]`, param.value)
}) })
} else { } else {
if (typeof params[name] === 'object') {
console.warning('Object detected in updateProfile API call. This will not work, use updateProfileJSON instead.')
}
formData.append(name, params[name]); formData.append(name, params[name]);
} }
} }
@ -237,6 +241,17 @@ const updateProfile = ({ credentials, params }) => {
.then((data) => parseUser(data)) .then((data) => parseUser(data))
} }
const updateProfileJSON = ({ credentials, params }) => {
return promisedRequest({
url: MASTODON_PROFILE_UPDATE_URL,
credentials,
payload: params ,
method: 'PATCH'
})
.then((data) => data.json())
.then((data) => parseUser(data))
}
// Params needed: // Params needed:
// nickname // nickname
// email // email
@ -1932,6 +1947,18 @@ const downloadRemoteEmojiPack = ({ instance, packName, as }) => {
) )
} }
const downloadRemoteEmojiPackZIP = ({ url, packName, file }) => {
const data = new FormData()
if (file) data.set('file', file)
if (url) data.set('url', url)
data.set('name', packName)
return fetch(
PLEROMA_EMOJI_PACKS_DL_REMOTE_ZIP_URL,
{ method: 'POST', body: data }
)
}
const saveEmojiPackMetadata = ({ name, newData }) => { const saveEmojiPackMetadata = ({ name, newData }) => {
return fetch( return fetch(
PLEROMA_EMOJI_PACK_URL(name), PLEROMA_EMOJI_PACK_URL(name),
@ -2060,6 +2087,7 @@ const apiService = {
getCaptcha, getCaptcha,
updateProfileImages, updateProfileImages,
updateProfile, updateProfile,
updateProfileJSON,
importMutes, importMutes,
importBlocks, importBlocks,
importFollows, importFollows,
@ -2137,6 +2165,7 @@ const apiService = {
deleteEmojiFile, deleteEmojiFile,
listRemoteEmojiPacks, listRemoteEmojiPacks,
downloadRemoteEmojiPack, downloadRemoteEmojiPack,
downloadRemoteEmojiPackZIP,
fetchBookmarkFolders, fetchBookmarkFolders,
createBookmarkFolder, createBookmarkFolder,
updateBookmarkFolder, updateBookmarkFolder,

View file

@ -508,7 +508,7 @@ export const useServerSideStorageStore = defineStore('serverSideStorage', {
this.updateCache({ username: window.vuex.state.users.currentUser.fqn }) this.updateCache({ username: window.vuex.state.users.currentUser.fqn })
const params = { pleroma_settings_store: { 'pleroma-fe': this.cache } } const params = { pleroma_settings_store: { 'pleroma-fe': this.cache } }
window.vuex.state.api.backendInteractor window.vuex.state.api.backendInteractor
.updateProfile({ params }) .updateProfileJSON({ params })
.then((user) => { .then((user) => {
this.setServerSideStorage(user) this.setServerSideStorage(user)
this.dirty = false this.dirty = false

584
yarn.lock

File diff suppressed because it is too large Load diff