From 64397708fdd706d28918cee8859c68ab8ed925c8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 6 Jul 2019 18:14:50 +0900 Subject: MisskeyPagesにイベント送信ボタンを追加 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/page-push.ts | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/server/api/endpoints/page-push.ts (limited to 'src/server/api') diff --git a/src/server/api/endpoints/page-push.ts b/src/server/api/endpoints/page-push.ts new file mode 100644 index 0000000000..300df7c250 --- /dev/null +++ b/src/server/api/endpoints/page-push.ts @@ -0,0 +1,44 @@ +import $ from 'cafy'; +import define from '../define'; +import { ID } from '../../../misc/cafy-id'; +import { publishMainStream } from '../../../services/stream'; +import { Users, Pages } from '../../../models'; +import { ApiError } from '../error'; + +export const meta = { + requireCredential: true, + secure: true, + + params: { + pageId: { + validator: $.type(ID) + }, + + event: { + validator: $.str + } + }, + + errors: { + noSuchPage: { + message: 'No such page.', + code: 'NO_SUCH_PAGE', + id: '4a13ad31-6729-46b4-b9af-e86b265c2e74' + } + } +}; + +export default define(meta, async (ps, user) => { + const page = await Pages.findOne(ps.pageId); + if (page == null) { + throw new ApiError(meta.errors.noSuchPage); + } + + publishMainStream(user.id, 'pageEvent', { + pageId: ps.pageId, + event: ps.event, + user: await Users.pack(user, page.userId, { + detail: true + }) + }); +}); -- cgit v1.2.3-freya From 047a46d96689a97bee4c843fcd86e63b816846f1 Mon Sep 17 00:00:00 2001 From: Satsuki Yanagi <17376330+u1-liquid@users.noreply.github.com> Date: Sun, 7 Jul 2019 01:38:36 +0900 Subject: Support password-less login with WebAuthn (#5112) * Support password-less login with WebAuthn * Fix initial value of usePasswordLessLogin --- locales/ja-JP.yml | 1 + migration/1562422242907-PasswordLessLogin.ts | 13 ++++++++ .../app/common/views/components/settings/2fa.vue | 16 ++++++++++ src/client/app/common/views/components/signin.vue | 6 +++- src/models/entities/user-profile.ts | 5 +++ src/models/repositories/user.ts | 2 +- src/server/api/endpoints/i/2fa/password-less.ts | 21 +++++++++++++ src/server/api/private/signin.ts | 36 +++++++++++++++++----- 8 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 migration/1562422242907-PasswordLessLogin.ts create mode 100644 src/server/api/endpoints/i/2fa/password-less.ts (limited to 'src/server/api') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 6666e630a3..5daf7e7e3a 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1112,6 +1112,7 @@ desktop/views/components/settings.2fa.vue: register-security-key: "キーの登録を完了" something-went-wrong: "わー! キーを登録する際に問題が発生しました:" key-unregistered: "キーが削除されました" + use-password-less-login: "パスワードなしのログインを使用" common/views/components/media-image.vue: sensitive: "閲覧注意" diff --git a/migration/1562422242907-PasswordLessLogin.ts b/migration/1562422242907-PasswordLessLogin.ts new file mode 100644 index 0000000000..e789a34334 --- /dev/null +++ b/migration/1562422242907-PasswordLessLogin.ts @@ -0,0 +1,13 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class PasswordLessLogin1562422242907 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "usePasswordLessLogin" boolean DEFAULT false NOT NULL`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "usePasswordLessLogin"`); + } + +} diff --git a/src/client/app/common/views/components/settings/2fa.vue b/src/client/app/common/views/components/settings/2fa.vue index eb645898e2..813a91b5c0 100644 --- a/src/client/app/common/views/components/settings/2fa.vue +++ b/src/client/app/common/views/components/settings/2fa.vue @@ -28,6 +28,10 @@ + + {{ $t('use-password-less-login') }} + + {{ $t('something-went-wrong') }} {{ registration.error }} {{ $t('register') }} @@ -80,6 +84,7 @@ export default Vue.extend({ return { data: null, supportsCredentials: !!navigator.credentials, + usePasswordLessLogin: this.$store.state.i.usePasswordLessLogin, registration: null, keyName: '', token: null @@ -112,6 +117,9 @@ export default Vue.extend({ if (canceled) return; this.$root.api('i/2fa/unregister', { password: password + }).then(() => { + this.usePasswordLessLogin = false; + this.updatePasswordLessLogin(); }).then(() => { this.$notify(this.$t('unregistered')); this.$store.state.i.twoFactorEnabled = false; @@ -157,6 +165,9 @@ export default Vue.extend({ return this.$root.api('i/2fa/remove-key', { password, credentialId: key.id + }).then(() => { + this.usePasswordLessLogin = false; + this.updatePasswordLessLogin(); }).then(() => { this.$notify(this.$t('key-unregistered')); }); @@ -213,6 +224,11 @@ export default Vue.extend({ this.registration.stage = -1; }); }); + }, + updatePasswordLessLogin() { + this.$root.api('i/2fa/password-less', { + value: !!this.usePasswordLessLogin + }); } } }); diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index 8498a1dc3e..f76f989d6d 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -7,7 +7,7 @@ - + {{ $t('password') }} @@ -28,6 +28,10 @@

{{ $t('enter-2fa-code') }}

+ + {{ $t('password') }} + + {{ $t('@.2fa') }} diff --git a/src/models/entities/user-profile.ts b/src/models/entities/user-profile.ts index 6f960f1b7b..4a588ebfbf 100644 --- a/src/models/entities/user-profile.ts +++ b/src/models/entities/user-profile.ts @@ -81,6 +81,11 @@ export class UserProfile { }) public securityKeysAvailable: boolean; + @Column('boolean', { + default: false, + }) + public usePasswordLessLogin: boolean; + @Column('varchar', { length: 128, nullable: true, comment: 'The password hash of the User. It will be null if the origin of the user is local.' diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts index cc89b674c5..06da74197f 100644 --- a/src/models/repositories/user.ts +++ b/src/models/repositories/user.ts @@ -156,6 +156,7 @@ export class UserRepository extends Repository { detail: true }), twoFactorEnabled: profile!.twoFactorEnabled, + usePasswordLessLogin: profile!.usePasswordLessLogin, securityKeys: profile!.twoFactorEnabled ? UserSecurityKeys.count({ userId: user.id @@ -208,7 +209,6 @@ export class UserRepository extends Repository { select: ['id', 'name', 'lastUsed'] }) : [] - } : {}), ...(relation ? { diff --git a/src/server/api/endpoints/i/2fa/password-less.ts b/src/server/api/endpoints/i/2fa/password-less.ts new file mode 100644 index 0000000000..19e75ca1c5 --- /dev/null +++ b/src/server/api/endpoints/i/2fa/password-less.ts @@ -0,0 +1,21 @@ +import $ from 'cafy'; +import define from '../../../define'; +import { UserProfiles } from '../../../../../models'; + +export const meta = { + requireCredential: true, + + secure: true, + + params: { + value: { + validator: $.boolean + } + } +}; + +export default define(meta, async (ps, user) => { + await UserProfiles.update(user.id, { + usePasswordLessLogin: ps.value + }); +}); diff --git a/src/server/api/private/signin.ts b/src/server/api/private/signin.ts index bc9346d088..67afed760b 100644 --- a/src/server/api/private/signin.ts +++ b/src/server/api/private/signin.ts @@ -72,19 +72,25 @@ export default async (ctx: Koa.BaseContext) => { } } - if (!same) { - await fail(403, { - error: 'incorrect password' - }); - return; - } - if (!profile.twoFactorEnabled) { - signin(ctx, user); + if (same) { + signin(ctx, user); + } else { + await fail(403, { + error: 'incorrect password' + }); + } return; } if (token) { + if (!same) { + await fail(403, { + error: 'incorrect password' + }); + return; + } + const verified = (speakeasy as any).totp.verify({ secret: profile.twoFactorSecret, encoding: 'base32', @@ -101,6 +107,13 @@ export default async (ctx: Koa.BaseContext) => { return; } } else if (body.credentialId) { + if (!same && !profile.usePasswordLessLogin) { + await fail(403, { + error: 'incorrect password' + }); + return; + } + const clientDataJSON = Buffer.from(body.clientDataJSON, 'hex'); const clientData = JSON.parse(clientDataJSON.toString('utf-8')); const challenge = await AttestationChallenges.findOne({ @@ -163,6 +176,13 @@ export default async (ctx: Koa.BaseContext) => { return; } } else { + if (!same && !profile.usePasswordLessLogin) { + await fail(403, { + error: 'incorrect password' + }); + return; + } + const keys = await UserSecurityKeys.find({ userId: user.id }); -- cgit v1.2.3-freya From e9251debe067077c91b7505d310f53388ed4944d Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 7 Jul 2019 05:12:31 +0900 Subject: イベント送信時に指定の変数の値を添付出来るように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 2 ++ .../pages/page-editor/els/page-editor.el.button.vue | 17 ++++++++++++++++- src/client/app/common/views/pages/page/page.button.vue | 5 ++++- src/server/api/endpoints/page-push.ts | 5 +++++ 4 files changed, 27 insertions(+), 2 deletions(-) (limited to 'src/server/api') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 6666e630a3..e63d501651 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2035,6 +2035,8 @@ pages: _pushEvent: event: "イベント名" message: "押したときに表示するメッセージ" + variable: "送信する変数" + no-variable: "なし" script: categories: diff --git a/src/client/app/common/views/pages/page-editor/els/page-editor.el.button.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.button.vue index 04001d8560..6a82b0eec9 100644 --- a/src/client/app/common/views/pages/page-editor/els/page-editor.el.button.vue +++ b/src/client/app/common/views/pages/page-editor/els/page-editor.el.button.vue @@ -17,6 +17,17 @@ @@ -39,6 +50,9 @@ export default Vue.extend({ value: { required: true }, + aiScript: { + required: true, + }, }, data() { @@ -53,7 +67,8 @@ export default Vue.extend({ if (this.value.content == null) Vue.set(this.value, 'content', null); if (this.value.event == null) Vue.set(this.value, 'event', null); if (this.value.message == null) Vue.set(this.value, 'message', null); - if (this.value.message == null) Vue.set(this.value, 'primary', false); + if (this.value.primary == null) Vue.set(this.value, 'primary', false); + if (this.value.var == null) Vue.set(this.value, 'var', null); }, }); diff --git a/src/client/app/common/views/pages/page/page.button.vue b/src/client/app/common/views/pages/page/page.button.vue index d3f0307625..4dc6570019 100644 --- a/src/client/app/common/views/pages/page/page.button.vue +++ b/src/client/app/common/views/pages/page/page.button.vue @@ -30,7 +30,10 @@ export default Vue.extend({ } else if (this.value.action === 'pushEvent') { this.$root.api('page-push', { pageId: this.script.page.id, - event: this.value.event + event: this.value.event, + ...(this.value.var ? { + var: this.script.vars[this.value.var] + } : {}) }); this.$root.dialog({ diff --git a/src/server/api/endpoints/page-push.ts b/src/server/api/endpoints/page-push.ts index 300df7c250..f5e1a4d1eb 100644 --- a/src/server/api/endpoints/page-push.ts +++ b/src/server/api/endpoints/page-push.ts @@ -16,6 +16,10 @@ export const meta = { event: { validator: $.str + }, + + var: { + validator: $.optional.nullable.any } }, @@ -37,6 +41,7 @@ export default define(meta, async (ps, user) => { publishMainStream(user.id, 'pageEvent', { pageId: ps.pageId, event: ps.event, + var: ps.var, user: await Users.pack(user, page.userId, { detail: true }) -- cgit v1.2.3-freya From bd8d7c3d0f1bb831f26a75a6107e34a85a1bc804 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 7 Jul 2019 06:56:13 +0900 Subject: Improve Page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ページをピン留めできるように * デッキでカラム内でページを見れるように --- locales/ja-JP.yml | 4 + migration/1562444565093-PinnedPage.ts | 17 ++ migration/1562448332510-PageTitleHideOption.ts | 13 ++ .../common/views/components/page/page.block.vue | 40 ++++ .../common/views/components/page/page.button.vue | 55 +++++ .../common/views/components/page/page.counter.vue | 47 +++++ .../app/common/views/components/page/page.if.vue | 30 +++ .../common/views/components/page/page.image.vue | 36 ++++ .../views/components/page/page.number-input.vue | 41 ++++ .../app/common/views/components/page/page.post.vue | 68 +++++++ .../common/views/components/page/page.section.vue | 55 +++++ .../common/views/components/page/page.switch.vue | 43 ++++ .../views/components/page/page.text-input.vue | 41 ++++ .../app/common/views/components/page/page.text.vue | 62 ++++++ .../views/components/page/page.textarea-input.vue | 36 ++++ .../common/views/components/page/page.textarea.vue | 33 +++ .../app/common/views/components/page/page.vue | 218 ++++++++++++++++++++ .../app/common/views/deck/deck.page-column.vue | 69 +++++++ .../common/views/deck/deck.user-column.home.vue | 7 + .../common/views/pages/page-editor/page-editor.vue | 6 + src/client/app/common/views/pages/page.vue | 63 ++++++ .../app/common/views/pages/page/page.block.vue | 40 ---- .../app/common/views/pages/page/page.button.vue | 55 ----- .../app/common/views/pages/page/page.counter.vue | 47 ----- src/client/app/common/views/pages/page/page.if.vue | 30 --- .../app/common/views/pages/page/page.image.vue | 36 ---- .../common/views/pages/page/page.number-input.vue | 41 ---- .../app/common/views/pages/page/page.post.vue | 68 ------- .../app/common/views/pages/page/page.section.vue | 55 ----- .../app/common/views/pages/page/page.switch.vue | 43 ---- .../common/views/pages/page/page.text-input.vue | 41 ---- .../app/common/views/pages/page/page.text.vue | 62 ------ .../views/pages/page/page.textarea-input.vue | 36 ---- .../app/common/views/pages/page/page.textarea.vue | 33 --- src/client/app/common/views/pages/page/page.vue | 224 --------------------- src/client/app/desktop/script.ts | 4 +- .../app/desktop/views/home/user/user.home.vue | 5 +- src/client/app/mobile/script.ts | 3 +- src/client/app/mobile/views/pages/user/home.vue | 8 + src/models/entities/page.ts | 5 + src/models/entities/user-profile.ts | 13 ++ src/models/repositories/page.ts | 1 + src/models/repositories/user.ts | 4 +- src/server/api/endpoints/i/update.ts | 27 ++- src/server/api/endpoints/pages/create.ts | 6 + src/server/api/endpoints/pages/update.ts | 5 + 46 files changed, 1058 insertions(+), 818 deletions(-) create mode 100644 migration/1562444565093-PinnedPage.ts create mode 100644 migration/1562448332510-PageTitleHideOption.ts create mode 100644 src/client/app/common/views/components/page/page.block.vue create mode 100644 src/client/app/common/views/components/page/page.button.vue create mode 100644 src/client/app/common/views/components/page/page.counter.vue create mode 100644 src/client/app/common/views/components/page/page.if.vue create mode 100644 src/client/app/common/views/components/page/page.image.vue create mode 100644 src/client/app/common/views/components/page/page.number-input.vue create mode 100644 src/client/app/common/views/components/page/page.post.vue create mode 100644 src/client/app/common/views/components/page/page.section.vue create mode 100644 src/client/app/common/views/components/page/page.switch.vue create mode 100644 src/client/app/common/views/components/page/page.text-input.vue create mode 100644 src/client/app/common/views/components/page/page.text.vue create mode 100644 src/client/app/common/views/components/page/page.textarea-input.vue create mode 100644 src/client/app/common/views/components/page/page.textarea.vue create mode 100644 src/client/app/common/views/components/page/page.vue create mode 100644 src/client/app/common/views/deck/deck.page-column.vue create mode 100644 src/client/app/common/views/pages/page.vue delete mode 100644 src/client/app/common/views/pages/page/page.block.vue delete mode 100644 src/client/app/common/views/pages/page/page.button.vue delete mode 100644 src/client/app/common/views/pages/page/page.counter.vue delete mode 100644 src/client/app/common/views/pages/page/page.if.vue delete mode 100644 src/client/app/common/views/pages/page/page.image.vue delete mode 100644 src/client/app/common/views/pages/page/page.number-input.vue delete mode 100644 src/client/app/common/views/pages/page/page.post.vue delete mode 100644 src/client/app/common/views/pages/page/page.section.vue delete mode 100644 src/client/app/common/views/pages/page/page.switch.vue delete mode 100644 src/client/app/common/views/pages/page/page.text-input.vue delete mode 100644 src/client/app/common/views/pages/page/page.text.vue delete mode 100644 src/client/app/common/views/pages/page/page.textarea-input.vue delete mode 100644 src/client/app/common/views/pages/page/page.textarea.vue delete mode 100644 src/client/app/common/views/pages/page/page.vue (limited to 'src/server/api') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index d29b96af1d..32a7fad398 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1907,6 +1907,7 @@ deck/deck.user-column.vue: activity: "アクティビティ" timeline: "タイムライン" pinned-notes: "ピン留めされた投稿" + pinned-page: "ピン留めされたページ" docs: edit-this-page-on-github: "間違いや改善点を見つけましたか?" @@ -1946,6 +1947,8 @@ pages: are-you-sure-delete: "このページを削除しますか?" page-deleted: "ページを削除しました" edit-this-page: "このページを編集" + pin-this-page: "ピン留め" + unpin-this-page: "ピン留め解除" view-source: "ソースを表示" view-page: "ページを見る" like: "いいね" @@ -1964,6 +1967,7 @@ pages: url: "ページURL" summary: "ページの要約" align-center: "中央寄せ" + hide-title-when-pinned: "ピン留めされているときにタイトルを非表示" font: "フォント" fontSerif: "セリフ" fontSansSerif: "サンセリフ" diff --git a/migration/1562444565093-PinnedPage.ts b/migration/1562444565093-PinnedPage.ts new file mode 100644 index 0000000000..4bdee22748 --- /dev/null +++ b/migration/1562444565093-PinnedPage.ts @@ -0,0 +1,17 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class PinnedPage1562444565093 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "user_profile" ADD "pinnedPageId" character varying(32)`); + await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27" UNIQUE ("pinnedPageId")`); + await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27" FOREIGN KEY ("pinnedPageId") REFERENCES "page"("id") ON DELETE SET NULL ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27"`); + await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27"`); + await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "pinnedPageId"`); + } + +} diff --git a/migration/1562448332510-PageTitleHideOption.ts b/migration/1562448332510-PageTitleHideOption.ts new file mode 100644 index 0000000000..acc9b7e26f --- /dev/null +++ b/migration/1562448332510-PageTitleHideOption.ts @@ -0,0 +1,13 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class PageTitleHideOption1562448332510 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "page" ADD "hideTitleWhenPinned" boolean NOT NULL DEFAULT false`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "hideTitleWhenPinned"`); + } + +} diff --git a/src/client/app/common/views/components/page/page.block.vue b/src/client/app/common/views/components/page/page.block.vue new file mode 100644 index 0000000000..1c421fc2c0 --- /dev/null +++ b/src/client/app/common/views/components/page/page.block.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/client/app/common/views/components/page/page.button.vue b/src/client/app/common/views/components/page/page.button.vue new file mode 100644 index 0000000000..87112aca0d --- /dev/null +++ b/src/client/app/common/views/components/page/page.button.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.counter.vue b/src/client/app/common/views/components/page/page.counter.vue new file mode 100644 index 0000000000..8d55319fe9 --- /dev/null +++ b/src/client/app/common/views/components/page/page.counter.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.if.vue b/src/client/app/common/views/components/page/page.if.vue new file mode 100644 index 0000000000..417ef0c553 --- /dev/null +++ b/src/client/app/common/views/components/page/page.if.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/client/app/common/views/components/page/page.image.vue b/src/client/app/common/views/components/page/page.image.vue new file mode 100644 index 0000000000..1285445eb0 --- /dev/null +++ b/src/client/app/common/views/components/page/page.image.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.number-input.vue b/src/client/app/common/views/components/page/page.number-input.vue new file mode 100644 index 0000000000..31da37330a --- /dev/null +++ b/src/client/app/common/views/components/page/page.number-input.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.post.vue b/src/client/app/common/views/components/page/page.post.vue new file mode 100644 index 0000000000..cb695e21e9 --- /dev/null +++ b/src/client/app/common/views/components/page/page.post.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.section.vue b/src/client/app/common/views/components/page/page.section.vue new file mode 100644 index 0000000000..03c009d9c3 --- /dev/null +++ b/src/client/app/common/views/components/page/page.section.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.switch.vue b/src/client/app/common/views/components/page/page.switch.vue new file mode 100644 index 0000000000..53695f1b36 --- /dev/null +++ b/src/client/app/common/views/components/page/page.switch.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.text-input.vue b/src/client/app/common/views/components/page/page.text-input.vue new file mode 100644 index 0000000000..cf917dd5a8 --- /dev/null +++ b/src/client/app/common/views/components/page/page.text-input.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.text.vue b/src/client/app/common/views/components/page/page.text.vue new file mode 100644 index 0000000000..326fd39050 --- /dev/null +++ b/src/client/app/common/views/components/page/page.text.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.textarea-input.vue b/src/client/app/common/views/components/page/page.textarea-input.vue new file mode 100644 index 0000000000..eece59fefb --- /dev/null +++ b/src/client/app/common/views/components/page/page.textarea-input.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.textarea.vue b/src/client/app/common/views/components/page/page.textarea.vue new file mode 100644 index 0000000000..03c8542cb0 --- /dev/null +++ b/src/client/app/common/views/components/page/page.textarea.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/client/app/common/views/components/page/page.vue b/src/client/app/common/views/components/page/page.vue new file mode 100644 index 0000000000..99e627fd89 --- /dev/null +++ b/src/client/app/common/views/components/page/page.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/src/client/app/common/views/deck/deck.page-column.vue b/src/client/app/common/views/deck/deck.page-column.vue new file mode 100644 index 0000000000..0ef391a51d --- /dev/null +++ b/src/client/app/common/views/deck/deck.page-column.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/client/app/common/views/deck/deck.user-column.home.vue b/src/client/app/common/views/deck/deck.user-column.home.vue index 56b117a7dd..9fb50a6672 100644 --- a/src/client/app/common/views/deck/deck.user-column.home.vue +++ b/src/client/app/common/views/deck/deck.user-column.home.vue @@ -1,5 +1,11 @@