diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php
index 477f96f51..106856eb5 100644
--- a/lib/AppInfo/Application.php
+++ b/lib/AppInfo/Application.php
@@ -54,6 +54,7 @@ use OCA\Deck\Notification\Notifier;
use OCA\Deck\Reference\BoardReferenceProvider;
use OCA\Deck\Reference\CardReferenceProvider;
use OCA\Deck\Reference\CommentReferenceProvider;
+use OCA\Deck\Reference\CreateCardReferenceProvider;
use OCA\Deck\Search\CardCommentProvider;
use OCA\Deck\Search\DeckProvider;
use OCA\Deck\Service\PermissionService;
@@ -129,6 +130,8 @@ class Application extends App implements IBootstrap {
$context->registerSearchProvider(CardCommentProvider::class);
$context->registerDashboardWidget(DeckWidget::class);
+ $context->registerReferenceProvider(CreateCardReferenceProvider::class);
+
// reference widget
$context->registerReferenceProvider(CardReferenceProvider::class);
$context->registerReferenceProvider(BoardReferenceProvider::class);
diff --git a/lib/Controller/CardApiController.php b/lib/Controller/CardApiController.php
index 1c9e87a18..443ad3719 100644
--- a/lib/Controller/CardApiController.php
+++ b/lib/Controller/CardApiController.php
@@ -81,8 +81,17 @@ class CardApiController extends ApiController {
*
* Get a specific card.
*/
- public function create($title, $type = 'plain', $order = 999, $description = '', $duedate = null) {
+ public function create($title, $type = 'plain', $order = 999, $description = '', $duedate = null, $labels = [], $users = []) {
$card = $this->cardService->create($title, $this->request->getParam('stackId'), $type, $order, $this->userId, $description, $duedate);
+
+ foreach ($labels as $labelId) {
+ $this->cardService->assignLabel($card->id, $labelId);
+ }
+
+ foreach ($users as $user) {
+ $this->assignmentService->assignUser($card->id, $user['id'], $user['type']);
+ }
+
return new DataResponse($card, HTTP::STATUS_OK);
}
diff --git a/lib/Controller/CardController.php b/lib/Controller/CardController.php
index b6f6e6958..d86ac5f93 100644
--- a/lib/Controller/CardController.php
+++ b/lib/Controller/CardController.php
@@ -78,8 +78,18 @@ class CardController extends Controller {
* @param int $order
* @return \OCP\AppFramework\Db\Entity
*/
- public function create($title, $stackId, $type = 'plain', $order = 999, string $description = '') {
- return $this->cardService->create($title, $stackId, $type, $order, $this->userId, $description);
+ public function create($title, $stackId, $type = 'plain', $order = 999, string $description = '', $duedate = null, $labels = [], $users = []) {
+ $card = $this->cardService->create($title, $stackId, $type, $order, $this->userId, $description, $duedate);
+
+ foreach ($labels as $label) {
+ $this->assignLabel($card->id, $label);
+ }
+
+ foreach ($users as $user) {
+ $this->assignmentService->assignUser($card->id, $user['id'], $user['type']);
+ }
+
+ return $card;
}
/**
diff --git a/lib/Reference/CreateCardReferenceProvider.php b/lib/Reference/CreateCardReferenceProvider.php
new file mode 100644
index 000000000..5afaa555d
--- /dev/null
+++ b/lib/Reference/CreateCardReferenceProvider.php
@@ -0,0 +1,78 @@
+l10n->t('Create a new deck card');
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getOrder(): int {
+ return 10;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getIconUrl(): string {
+ return $this->urlGenerator->getAbsoluteURL(
+ $this->urlGenerator->imagePath(Application::APP_ID, 'deck-dark.svg')
+ );
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function matchReference(string $referenceText): bool {
+ return false;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function resolveReference(string $referenceText): ?IReference {
+ return null;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getCachePrefix(string $referenceId): string {
+ return $this->userId ?? '';
+ }
+
+ /**
+ * We don't use the userId here but rather a reference unique id
+ * @inheritDoc
+ */
+ public function getCacheKey(string $referenceId): ?string {
+ return $referenceId;
+ }
+}
diff --git a/src/CardCreateDialog.vue b/src/CardCreateDialog.vue
index 604640a6f..e3241f6c6 100644
--- a/src/CardCreateDialog.vue
+++ b/src/CardCreateDialog.vue
@@ -22,101 +22,23 @@
-
+
-
-
diff --git a/src/components/AttachmentDragAndDrop.vue b/src/components/AttachmentDragAndDrop.vue
index 80bc7d17d..d88ef760c 100644
--- a/src/components/AttachmentDragAndDrop.vue
+++ b/src/components/AttachmentDragAndDrop.vue
@@ -66,12 +66,7 @@ import { NcModal } from '@nextcloud/vue'
import attachmentUpload from '../mixins/attachmentUpload.js'
import { loadState } from '@nextcloud/initial-state'
-let maxUploadSizeState
-try {
- maxUploadSizeState = loadState('deck', 'maxUploadSize')
-} catch (e) {
- maxUploadSizeState = -1
-}
+const maxUploadSizeState = loadState('deck', 'maxUploadSize', -1)
export default {
name: 'AttachmentDragAndDrop',
diff --git a/src/components/Controls.vue b/src/components/Controls.vue
index 0ab662036..5899901c7 100644
--- a/src/components/Controls.vue
+++ b/src/components/Controls.vue
@@ -30,7 +30,9 @@
{{ t('deck', 'Add card') }}
-
+
+
+
@@ -218,9 +220,8 @@
+
+
diff --git a/src/components/card/AttachmentList.vue b/src/components/card/AttachmentList.vue
index 5282f4c5e..96a171ab2 100644
--- a/src/components/card/AttachmentList.vue
+++ b/src/components/card/AttachmentList.vue
@@ -113,7 +113,7 @@ import { mapState, mapActions } from 'vuex'
import { loadState } from '@nextcloud/initial-state'
import attachmentUpload from '../../mixins/attachmentUpload.js'
import { getFilePickerBuilder } from '@nextcloud/dialogs'
-const maxUploadSizeState = loadState('deck', 'maxUploadSize')
+const maxUploadSizeState = loadState('deck', 'maxUploadSize', -1)
const picker = getFilePickerBuilder(t('deck', 'File to share'))
.setMultiSelect(false)
diff --git a/src/components/card/CardSidebarTabDetails.vue b/src/components/card/CardSidebarTabDetails.vue
index 30ca71501..46d545d2a 100644
--- a/src/components/card/CardSidebarTabDetails.vue
+++ b/src/components/card/CardSidebarTabDetails.vue
@@ -22,96 +22,20 @@
-
-
- {{ t('deck', 'Tags') }}
-
-
-
-
-
- {{ scope.option.title }}
-
-
-
-
- {{ scope.option.title }}
-
-
-
-
-
+
-
-
- {{ t('deck', 'Assign to users/groups/circles') }}
-
-
-
+
-
-
- {{ t('deck', 'Due date') }}
-
-
-
-
-
- {{ t('deck', 'Remove due date') }}
-
-
-
-
+
-
+
+
diff --git a/src/components/card/TagSelector.vue b/src/components/card/TagSelector.vue
new file mode 100644
index 000000000..6bf6e4d0e
--- /dev/null
+++ b/src/components/card/TagSelector.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+ {{ scope.option.title }}
+
+
+
+
+ {{ scope.option.title }}
+
+
+
+
+
+
+
+
+
diff --git a/src/init-reference.js b/src/init-reference.js
index fa983ebcb..dab2f7ad6 100644
--- a/src/init-reference.js
+++ b/src/init-reference.js
@@ -19,7 +19,7 @@
* along with this program. If not, see
.
*/
-import { registerWidget } from '@nextcloud/vue/dist/Components/NcRichText.js'
+import { registerWidget, registerCustomPickerElement, NcCustomPickerRenderResult } from '@nextcloud/vue/dist/Components/NcRichText.js'
import { Tooltip } from '@nextcloud/vue'
import Vue from 'vue'
import CardReferenceWidget from './views/CardReferenceWidget.vue'
@@ -35,6 +35,11 @@ Vue.prototype.n = translatePlural
Vue.prototype.OC = window.OC
Vue.prototype.OCA = window.OCA
Vue.directive('tooltip', Tooltip)
+Vue.directive('focus', {
+ inserted(el) {
+ el.focus()
+ },
+})
registerWidget('deck-card', (el, { richObjectType, richObject, accessible }) => {
// trick to change the wrapper element size, otherwise it always is 100%
@@ -82,3 +87,19 @@ registerWidget('deck-comment', (el, { richObjectType, richObject, accessible })
},
}).$mount(el)
})
+
+registerCustomPickerElement('create-new-deck-card', async (el, { providerId, accessible }) => {
+ const { default: Vue } = await import(/* webpackChunkName: "reference-picker-lazy" */'vue')
+ Vue.mixin({ methods: { t, n } })
+ const { default: CreateNewCardCustomPicker } = await import(/* webpackChunkName: "reference-picker-lazy" */'./views/CreateNewCardCustomPicker.vue')
+ const Element = Vue.extend(CreateNewCardCustomPicker)
+ const vueElement = new Element({
+ propsData: {
+ providerId,
+ accessible,
+ },
+ }).$mount(el)
+ return new NcCustomPickerRenderResult(vueElement.$el, vueElement)
+}, (el, renderResult) => {
+ renderResult.object.$destroy()
+}, 'normal')
diff --git a/src/views/CreateNewCardCustomPicker.vue b/src/views/CreateNewCardCustomPicker.vue
new file mode 100644
index 000000000..fc1170d25
--- /dev/null
+++ b/src/views/CreateNewCardCustomPicker.vue
@@ -0,0 +1,354 @@
+
+
+
+
+
+
+
diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue
index f37024b53..2ed2510cc 100644
--- a/src/views/Dashboard.vue
+++ b/src/views/Dashboard.vue
@@ -54,26 +54,29 @@
{{ t('deck', 'New card') }}
-
+
+
+