Compare commits
12 Commits
backport/6
...
stable27
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb36579e03 | ||
|
|
3f7389d773 | ||
|
|
9746870ad6 | ||
|
|
89bb483a0d | ||
|
|
1bbc19f9e0 | ||
|
|
7467cca0cc | ||
|
|
49996522e3 | ||
|
|
0b52b7f945 | ||
|
|
2493566efb | ||
|
|
81d081f12d | ||
|
|
3fa6123e53 | ||
|
|
06f209ed04 |
2
.github/workflows/appbuild.yml
vendored
2
.github/workflows/appbuild.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
||||
uname -a
|
||||
RUST_BACKTRACE=1 krankerl --version
|
||||
RUST_BACKTRACE=1 krankerl package
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Deck app tarball
|
||||
path: build/artifacts/deck.tar.gz
|
||||
|
||||
4
.github/workflows/cypress.yml
vendored
4
.github/workflows/cypress.yml
vendored
@@ -108,7 +108,7 @@ jobs:
|
||||
npm_package_name: ${{ env.APP_NAME }}
|
||||
|
||||
- name: Upload test failure screenshots
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: Upload screenshots
|
||||
@@ -116,7 +116,7 @@ jobs:
|
||||
retention-days: 5
|
||||
|
||||
- name: Upload nextcloud logs
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: Upload nextcloud log
|
||||
|
||||
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,9 +1,21 @@
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## 1.11.7
|
||||
|
||||
### Fixed
|
||||
- fix: Load archived card if URL is opened directly #6323
|
||||
|
||||
## 1.11.6
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: Avoid optional before required parameter [#6094](https://github.com/nextcloud/deck/pull/6094)
|
||||
- use deleted_users for users that do not exist [#6202](https://github.com/nextcloud/deck/pull/6202)
|
||||
|
||||
## 1.11.5
|
||||
|
||||
### Fixed
|
||||
### Fixed
|
||||
- don't reset update time when no update was written to db #6036
|
||||
- fix: Avoid conflicts on deck attachments folder name #5709
|
||||
- fix: permission check for cloning board #5856
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
- 🚀 Get your project organized
|
||||
|
||||
</description>
|
||||
<version>1.11.5</version>
|
||||
<version>1.11.7</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<documentation>
|
||||
|
||||
@@ -114,7 +114,8 @@ describe('Card', function() {
|
||||
cy.get('.file-picker__main [data-filename="welcome.txt"]').should('be.visible')
|
||||
.click()
|
||||
cy.get('.dialog__actions button.button-vue--vue-primary').click()
|
||||
cy.get('.attachment-list .basename').contains('welcome.txt')
|
||||
cy.get('.attachment-list .filename').contains('welcome')
|
||||
cy.get('.attachment-list .filename .extension').contains('txt')
|
||||
})
|
||||
|
||||
it('Shows the modal with the editor', () => {
|
||||
|
||||
@@ -133,7 +133,7 @@ class TrelloJsonService extends ABoardImportService {
|
||||
$cardId = $this->cards[$trelloCard->id]->getId();
|
||||
$comment = new Comment();
|
||||
if (!empty($this->getImportService()->getConfig('uidRelation')->{$trelloComment->memberCreator->username})) {
|
||||
$actor = $this->getImportService()->getConfig('uidRelation')->{$trelloComment->memberCreator->username}->getUID();
|
||||
$actor = $this->getImportService()->getConfig('uidRelation')->{$trelloComment->memberCreator->username};
|
||||
} else {
|
||||
$actor = $this->getImportService()->getConfig('owner')->getUID();
|
||||
}
|
||||
@@ -361,7 +361,7 @@ class TrelloJsonService extends ABoardImportService {
|
||||
|
||||
private function replaceUsernames(string $text): string {
|
||||
foreach ($this->getImportService()->getConfig('uidRelation') as $trello => $nextcloud) {
|
||||
$text = str_replace($trello, $nextcloud->getUID(), $text);
|
||||
$text = str_replace($trello, $nextcloud, $text);
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "deck",
|
||||
"version": "1.11.5",
|
||||
"version": "1.11.7",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "deck",
|
||||
"version": "1.11.5",
|
||||
"version": "1.11.7",
|
||||
"license": "agpl",
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "deck",
|
||||
"description": "",
|
||||
"version": "1.11.5",
|
||||
"version": "1.11.7",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Julius Härtl",
|
||||
@@ -105,4 +105,4 @@
|
||||
"<rootDir>/node_modules/jest-serializer-vue"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,6 +160,16 @@ export default {
|
||||
await this.$store.dispatch('loadBoardById', this.id)
|
||||
await this.$store.dispatch('loadStacks', this.id)
|
||||
|
||||
const routeCardId = parseInt(this.$route.params.cardId)
|
||||
// If an archived card is requested, and we cannot find it in the current we load the archived stacks instead
|
||||
if (routeCardId && !this.$store.getters.cardById(routeCardId)) {
|
||||
await this.$store.dispatch('loadArchivedStacks', this.id)
|
||||
|
||||
if (this.$store.getters.cardById(routeCardId)) {
|
||||
this.$store.commit('toggleShowArchived', true)
|
||||
}
|
||||
}
|
||||
|
||||
this.session?.close()
|
||||
this.session = createSession(this.id)
|
||||
} catch (e) {
|
||||
|
||||
@@ -41,7 +41,8 @@
|
||||
<div class="details">
|
||||
<a>
|
||||
<div class="filename">
|
||||
<span class="basename">{{ attachment.name }}</span>
|
||||
<span>{{ attachmentBasename(attachment) }}</span>
|
||||
<span class="extension">.{{ attachmentExtension(attachment) }}</span>
|
||||
</div>
|
||||
<progress :value="attachment.progress" max="100" />
|
||||
</a>
|
||||
@@ -58,7 +59,8 @@
|
||||
<div class="details">
|
||||
<a :href="internalLink(attachment)" @click.prevent="showViewer(attachment)">
|
||||
<div class="filename">
|
||||
<span class="basename">{{ attachment.data }}</span>
|
||||
<span>{{ attachmentBasename(attachment) }}</span>
|
||||
<span class="extension">.{{ attachmentExtension(attachment) }}</span>
|
||||
</div>
|
||||
<div v-if="attachment.deletedAt === 0">
|
||||
<span class="filesize">{{ formattedFileSize(attachment.extendedData.filesize) }}</span>
|
||||
@@ -200,6 +202,14 @@ export default {
|
||||
return t('deck', 'Drop your files to upload')
|
||||
}
|
||||
},
|
||||
attachmentBasename() {
|
||||
return (attachment) => attachment?.extendedData?.info.filename
|
||||
?? (attachment?.name ?? attachment.data).replace(/\.[^/.]+$/, '')
|
||||
},
|
||||
attachmentExtension() {
|
||||
return (attachment) => attachment?.extendedData?.info?.extension
|
||||
?? (attachment?.name ?? attachment.data).split('.').pop()
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
cardId: {
|
||||
|
||||
@@ -255,15 +255,18 @@ export default {
|
||||
},
|
||||
addAttachment(attachment) {
|
||||
const asImage = (attachment.type === 'file' && attachment.extendedData.hasPreview) || attachment.extendedData.mimetype.includes('image')
|
||||
// We need to strip those as text does not support rtl yet, so we cannot insert them separately
|
||||
const stripRTLO = (text) => text.replaceAll('\u202e', '')
|
||||
const fileName = stripRTLO(attachment.extendedData.info.filename) + '.' + stripRTLO(attachment.extendedData.info.extension)
|
||||
if (this.editor) {
|
||||
this.editor.insertAtCursor(
|
||||
asImage
|
||||
? `<a href="${this.attachmentPreview(attachment)}"><img src="${this.attachmentPreview(attachment)}" alt="${attachment.data}" /></a>`
|
||||
: `<a href="${this.attachmentPreview(attachment)}">${attachment.data}</a>`,
|
||||
: `<a href="${this.attachmentPreview(attachment)}">${fileName}</a>`,
|
||||
)
|
||||
return
|
||||
} else {
|
||||
const attachmentString = (asImage ? '!' : '') + '[📎 ' + attachment.data + '](' + this.attachmentPreview(attachment) + ')'
|
||||
const attachmentString = (asImage ? '!' : '') + '[📎 ' + fileName + '](' + this.attachmentPreview(attachment) + ')'
|
||||
const descString = this.$refs.markdownEditor.easymde.value()
|
||||
const newContent = descString + '\n' + attachmentString
|
||||
this.$refs.markdownEditor.easymde.value(newContent)
|
||||
|
||||
@@ -179,8 +179,8 @@ export default new Vuex.Store({
|
||||
}
|
||||
})
|
||||
},
|
||||
toggleShowArchived(state) {
|
||||
state.showArchived = !state.showArchived
|
||||
toggleShowArchived(state, newState = undefined) {
|
||||
state.showArchived = newState !== undefined ? newState : !state.showArchived
|
||||
},
|
||||
/*
|
||||
* Adds or replaces a board in the store.
|
||||
|
||||
@@ -95,6 +95,21 @@ export default {
|
||||
}
|
||||
commit('setCards', cards)
|
||||
},
|
||||
async loadArchivedStacks({ commit, getters }, boardId) {
|
||||
const archivedStacks = await apiClient.loadArchivedStacks(boardId)
|
||||
const cards = []
|
||||
for (const i in archivedStacks) {
|
||||
const stack = archivedStacks[i]
|
||||
for (const j in stack.cards) {
|
||||
cards.push(stack.cards[j])
|
||||
}
|
||||
delete stack.cards
|
||||
if (!getters.stackById(stack.id)) {
|
||||
commit('addStack', stack)
|
||||
}
|
||||
}
|
||||
commit('setCards', cards)
|
||||
},
|
||||
createStack({ commit }, stack) {
|
||||
stack.boardId = this.state.currentBoard.id
|
||||
apiClient.createStack(stack)
|
||||
|
||||
Reference in New Issue
Block a user