summaryrefslogtreecommitdiff
path: root/packages/client/src/components/ui
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-06-11 15:45:44 +0900
committerGitHub <noreply@github.com>2022-06-11 15:45:44 +0900
commitecb3c43520e1f47447a86f4cac8b25aef039f229 (patch)
tree0d5bb902d078d47f1b8f0b040700c307dec32fb2 /packages/client/src/components/ui
parentupdate cypress (diff)
downloadmisskey-ecb3c43520e1f47447a86f4cac8b25aef039f229.tar.gz
misskey-ecb3c43520e1f47447a86f4cac8b25aef039f229.tar.bz2
misskey-ecb3c43520e1f47447a86f4cac8b25aef039f229.zip
feat: image cropping (#8808)
* wip * wip * wip
Diffstat (limited to 'packages/client/src/components/ui')
-rw-r--r--packages/client/src/components/ui/modal-window.vue128
-rw-r--r--packages/client/src/components/ui/modal.vue9
2 files changed, 70 insertions, 67 deletions
diff --git a/packages/client/src/components/ui/modal-window.vue b/packages/client/src/components/ui/modal-window.vue
index 6de29c83fa..d2b2ccff7a 100644
--- a/packages/client/src/components/ui/modal-window.vue
+++ b/packages/client/src/components/ui/modal-window.vue
@@ -1,7 +1,7 @@
<template>
-<MkModal ref="modal" :prefer-type="'dialog'" @click="$emit('click')" @closed="$emit('closed')">
- <div class="ebkgoccj _window _narrow_" :style="{ width: `${width}px`, height: scroll ? (height ? `${height}px` : null) : (height ? `min(${height}px, 100%)` : '100%') }" @keydown="onKeydown">
- <div class="header">
+<MkModal ref="modal" :prefer-type="'dialog'" @click="onBgClick" @closed="$emit('closed')">
+ <div ref="rootEl" class="ebkgoccj _window _narrow_" :style="{ width: `${width}px`, height: scroll ? (height ? `${height}px` : null) : (height ? `min(${height}px, 100%)` : '100%') }" @keydown="onKeydown">
+ <div ref="headerEl" class="header">
<button v-if="withOkButton" class="_button" @click="$emit('close')"><i class="fas fa-times"></i></button>
<span class="title">
<slot name="header"></slot>
@@ -11,82 +11,82 @@
</div>
<div v-if="padding" class="body">
<div class="_section">
- <slot></slot>
+ <slot :width="bodyWidth" :height="bodyHeight"></slot>
</div>
</div>
<div v-else class="body">
- <slot></slot>
+ <slot :width="bodyWidth" :height="bodyHeight"></slot>
</div>
</div>
</MkModal>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { onMounted, onUnmounted } from 'vue';
import MkModal from './modal.vue';
-export default defineComponent({
- components: {
- MkModal
- },
- props: {
- withOkButton: {
- type: Boolean,
- required: false,
- default: false
- },
- okButtonDisabled: {
- type: Boolean,
- required: false,
- default: false
- },
- padding: {
- type: Boolean,
- required: false,
- default: false
- },
- width: {
- type: Number,
- required: false,
- default: 400
- },
- height: {
- type: Number,
- required: false,
- default: null
- },
- canClose: {
- type: Boolean,
- required: false,
- default: true,
- },
- scroll: {
- type: Boolean,
- required: false,
- default: true,
- },
- },
+const props = withDefaults(defineProps<{
+ withOkButton: boolean;
+ okButtonDisabled: boolean;
+ padding: boolean;
+ width: number;
+ height: number | null;
+ scroll: boolean;
+}>(), {
+ withOkButton: false,
+ okButtonDisabled: false,
+ padding: false,
+ width: 400,
+ height: null,
+ scroll: true,
+});
- emits: ['click', 'close', 'closed', 'ok'],
+const emit = defineEmits<{
+ (event: 'click'): void;
+ (event: 'close'): void;
+ (event: 'closed'): void;
+ (event: 'ok'): void;
+}>();
- data() {
- return {
- };
- },
+let modal = $ref<InstanceType<typeof MkModal>>();
+let rootEl = $ref<HTMLElement>();
+let headerEl = $ref<HTMLElement>();
+let bodyWidth = $ref(0);
+let bodyHeight = $ref(0);
- methods: {
- close() {
- this.$refs.modal.close();
- },
+const close = () => {
+ modal.close();
+};
- onKeydown(evt) {
- if (evt.which === 27) { // Esc
- evt.preventDefault();
- evt.stopPropagation();
- this.close();
- }
- },
+const onBgClick = () => {
+ emit('click');
+};
+
+const onKeydown = (evt) => {
+ if (evt.which === 27) { // Esc
+ evt.preventDefault();
+ evt.stopPropagation();
+ close();
}
+};
+
+const ro = new ResizeObserver((entries, observer) => {
+ bodyWidth = rootEl.offsetWidth;
+ bodyHeight = rootEl.offsetHeight - headerEl.offsetHeight;
+});
+
+onMounted(() => {
+ bodyWidth = rootEl.offsetWidth;
+ bodyHeight = rootEl.offsetHeight - headerEl.offsetHeight;
+ ro.observe(rootEl);
+});
+
+onUnmounted(() => {
+ ro.disconnect();
+});
+
+defineExpose({
+ close,
});
</script>
diff --git a/packages/client/src/components/ui/modal.vue b/packages/client/src/components/ui/modal.vue
index 010262da2f..d6a29ec4b7 100644
--- a/packages/client/src/components/ui/modal.vue
+++ b/packages/client/src/components/ui/modal.vue
@@ -1,5 +1,5 @@
<template>
-<transition :name="$store.state.animation ? (type === 'drawer') ? 'modal-drawer' : (type === 'popup') ? 'modal-popup' : 'modal' : ''" :duration="$store.state.animation ? 200 : 0" appear @after-leave="emit('closed')" @enter="emit('opening')" @after-enter="childRendered">
+<transition :name="$store.state.animation ? (type === 'drawer') ? 'modal-drawer' : (type === 'popup') ? 'modal-popup' : 'modal' : ''" :duration="$store.state.animation ? 200 : 0" appear @after-leave="emit('closed')" @enter="emit('opening')" @after-enter="onOpened">
<div v-show="manualShowing != null ? manualShowing : showing" v-hotkey.global="keymap" class="qzhlnise" :class="{ drawer: type === 'drawer', dialog: type === 'dialog' || type === 'dialog:top', popup: type === 'popup' }" :style="{ zIndex, pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }">
<div class="bg _modalBg" :class="{ transparent: transparentBg && (type === 'popup') }" :style="{ zIndex }" @click="onBgClick" @contextmenu.prevent.stop="() => {}"></div>
<div ref="content" class="content" :class="{ fixed, top: type === 'dialog:top' }" :style="{ zIndex }" @click.self="onBgClick">
@@ -48,6 +48,7 @@ const props = withDefaults(defineProps<{
const emit = defineEmits<{
(ev: 'opening'): void;
+ (ev: 'opened'): void;
(ev: 'click'): void;
(ev: 'esc'): void;
(ev: 'close'): void;
@@ -212,7 +213,9 @@ const align = () => {
popover.style.top = top + 'px';
};
-const childRendered = () => {
+const onOpened = () => {
+ emit('opened');
+
// モーダルコンテンツにマウスボタンが押され、コンテンツ外でマウスボタンが離されたときにモーダルバックグラウンドクリックと判定させないためにマウスイベントを監視しフラグ管理する
const el = content.value!.children[0];
el.addEventListener('mousedown', ev => {
@@ -237,7 +240,7 @@ onMounted(() => {
await nextTick();
align();
- }, { immediate: true, });
+ }, { immediate: true });
nextTick(() => {
const popover = content.value;