diff --git a/app/src/app.vue b/app/src/app.vue index 1af46b55dd..aac919bf04 100644 --- a/app/src/app.vue +++ b/app/src/app.vue @@ -48,7 +48,7 @@ export default defineComponent({ const userStore = useUserStore(); const settingsStore = useSettingsStore(); - const { hydrating, drawerOpen } = toRefs(appStore.state); + const { hydrating, sidebarOpen } = toRefs(appStore.state); const brandStyle = computed(() => { return { @@ -73,9 +73,9 @@ export default defineComponent({ if (newWidth === oldWidth) return; if (newWidth >= 1424) { - if (drawerOpen.value === false) drawerOpen.value = true; + if (sidebarOpen.value === false) sidebarOpen.value = true; } else { - if (drawerOpen.value === true) drawerOpen.value = false; + if (sidebarOpen.value === true) sidebarOpen.value = false; } }, { immediate: true } diff --git a/app/src/components/register.ts b/app/src/components/register.ts index f7a3d66826..53c643919b 100644 --- a/app/src/components/register.ts +++ b/app/src/components/register.ts @@ -22,8 +22,7 @@ import VInput from './v-input/'; import VItemGroup, { VItem } from './v-item-group'; import VList, { VListGroup, VListItem, VListItemContent, VListItemHint, VListItemIcon, VListItemText } from './v-list/'; import VMenu from './v-menu/'; -import VModal from './v-modal/'; -import VModalHeading from './v-modal/v-modal-heading.vue'; +import VDrawer from './v-drawer/'; import VNotice from './v-notice/'; import VOverlay from './v-overlay/'; import VPagination from './v-pagination/'; @@ -73,8 +72,7 @@ Vue.component('v-list-item-text', VListItemText); Vue.component('v-list-item', VListItem); Vue.component('v-list', VList); Vue.component('v-menu', VMenu); -Vue.component('v-modal', VModal); -Vue.component('v-modal-heading', VModalHeading); +Vue.component('v-drawer', VDrawer); Vue.component('v-notice', VNotice); Vue.component('v-overlay', VOverlay); Vue.component('v-pagination', VPagination); @@ -104,14 +102,14 @@ Vue.component('transition-expand', TransitionExpand); import RenderDisplay from '@/views/private/components/render-display'; import RenderTemplate from '@/views/private/components/render-template'; -import DrawerDetail from '@/views/private/components/drawer-detail/'; -import FilterDrawerDetail from '@/views/private/components/filter-drawer-detail'; +import SidebarDetail from '@/views/private/components/sidebar-detail/'; +import FilterSidebarDetail from '@/views/private/components/filter-sidebar-detail'; import UserPopover from '@/views/private/components/user-popover'; import ValueNull from '@/views/private/components/value-null'; Vue.component('render-display', RenderDisplay); Vue.component('render-template', RenderTemplate); -Vue.component('filter-drawer-detail', FilterDrawerDetail); -Vue.component('drawer-detail', DrawerDetail); +Vue.component('filter-sidebar-detail', FilterSidebarDetail); +Vue.component('sidebar-detail', SidebarDetail); Vue.component('user-popover', UserPopover); Vue.component('value-null', ValueNull); diff --git a/app/src/components/transition/dialog/transition-dialog.vue b/app/src/components/transition/dialog/transition-dialog.vue index 41ba222234..451d0ed13b 100644 --- a/app/src/components/transition/dialog/transition-dialog.vue +++ b/app/src/components/transition/dialog/transition-dialog.vue @@ -5,24 +5,34 @@ diff --git a/app/src/components/v-dialog/v-dialog.vue b/app/src/components/v-dialog/v-dialog.vue index 0a734c2630..a411cd4d69 100644 --- a/app/src/components/v-dialog/v-dialog.vue +++ b/app/src/components/v-dialog/v-dialog.vue @@ -3,7 +3,7 @@ -
+
@@ -30,6 +30,11 @@ export default defineComponent({ type: Boolean, default: false, }, + placement: { + type: String, + default: 'center', + validator: (val: string) => ['center', 'right'].includes(val), + }, }, setup(props, { emit }) { const dialog = ref(null); @@ -92,11 +97,32 @@ export default defineComponent({ left: 0; z-index: 500; display: flex; - align-items: center; - justify-content: center; width: 100%; height: 100%; - transition: opacity var(--medium) var(--transition); + + ::v-deep > * { + z-index: 2; + box-shadow: 0px 4px 12px rgba(38, 50, 56, 0.1); + } + + &.center { + align-items: center; + justify-content: center; + + &.nudge > ::v-deep *:not(:first-child) { + animation: nudge 200ms; + } + } + + &.right { + align-items: center; + justify-content: flex-end; + + &.nudge > ::v-deep *:not(:first-child) { + transform-origin: right; + animation: shake 200ms; + } + } ::v-deep .v-card { --v-card-min-width: 540px; @@ -112,15 +138,6 @@ export default defineComponent({ .v-overlay { --v-overlay-z-index: 1; } - - &.nudge { - animation: nudge 200ms; - } - - ::v-deep > * { - z-index: 2; - box-shadow: 0px 4px 12px rgba(38, 50, 56, 0.1); - } } @keyframes nudge { @@ -136,4 +153,18 @@ export default defineComponent({ transform: scale(1); } } + +@keyframes shake { + 0% { + transform: scaleX(1); + } + + 50% { + transform: scaleX(0.98); + } + + 100% { + transform: scaleX(1); + } +} diff --git a/app/src/components/v-drawer/index.ts b/app/src/components/v-drawer/index.ts new file mode 100644 index 0000000000..789569bf51 --- /dev/null +++ b/app/src/components/v-drawer/index.ts @@ -0,0 +1,4 @@ +import VDrawer from './v-drawer.vue'; + +export { VDrawer }; +export default VDrawer; diff --git a/app/src/components/v-modal/v-modal.vue b/app/src/components/v-drawer/v-drawer.vue similarity index 53% rename from app/src/components/v-modal/v-modal.vue rename to app/src/components/v-drawer/v-drawer.vue index fcce7ff4c3..1a5cb99bfd 100644 --- a/app/src/components/v-modal/v-modal.vue +++ b/app/src/components/v-drawer/v-drawer.vue @@ -1,20 +1,23 @@ diff --git a/app/src/components/v-form/v-form.vue b/app/src/components/v-form/v-form.vue index 959e66f79b..8535bb817b 100644 --- a/app/src/components/v-form/v-form.vue +++ b/app/src/components/v-form/v-form.vue @@ -139,10 +139,10 @@ export default defineComponent({ const gridClass = computed(() => { if (el.value === null) return null; - if (width.value > 588 && width.value <= 792) { - return 'grid'; - } else { + if (width.value > 792) { return 'grid with-fill'; + } else { + return 'grid'; } return null; diff --git a/app/src/components/v-modal/index.ts b/app/src/components/v-modal/index.ts deleted file mode 100644 index c3a4ca2b16..0000000000 --- a/app/src/components/v-modal/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import VModal from './v-modal.vue'; - -export { VModal }; -export default VModal; diff --git a/app/src/components/v-modal/readme.md b/app/src/components/v-modal/readme.md deleted file mode 100644 index 9818b9ca27..0000000000 --- a/app/src/components/v-modal/readme.md +++ /dev/null @@ -1,73 +0,0 @@ -# Modal - -A modal is basically an elaborate pre-configured dialog. It supports an optional left sidebar that allows for easier tab usage. - -## Usage - -```html - - Hello, world! - -``` - -```html - - - - Hello, world! - -``` - -```html - - - - - - - Hello, world! - I'm page 2! - I'm page 3! - - - - -``` - -## Props - -| Prop | Description | Default | -|--------------|-----------------------------------------------------------------|---------| -| `title`* | Title for the modal | | -| `subtitle` | Optional subtitle for the modal | | -| `active` | If the modal is active. Used in `v-model` | `false` | -| `persistent` | Prevent the user from exiting the modal by clicking the overlay | `false` | - -## Events - -| Event | Description | Value | -|----------|--------------------------|-----------| -| `toggle` | Sync the `v-model` value | `boolean` | - -## Slots -| Slot | Description | Data | -|-------------|--------------------------------------------------------|-------------------------| -| _default_ | Modal content | | -| `activator` | Element to enable the modal | `{ on: () => void }` | -| `sidebar` | Sidebar content for the modal. Often used for `v-tabs` | | -| `footer` | Footer content. Often used for action buttons | `{ close: () => void }` | - -## CSS Variables -n/a diff --git a/app/src/components/v-modal/v-modal-heading.vue b/app/src/components/v-modal/v-modal-heading.vue deleted file mode 100644 index 87e523381e..0000000000 --- a/app/src/components/v-modal/v-modal-heading.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - diff --git a/app/src/components/v-modal/v-modal.story.ts b/app/src/components/v-modal/v-modal.story.ts deleted file mode 100644 index c9d9ba61b4..0000000000 --- a/app/src/components/v-modal/v-modal.story.ts +++ /dev/null @@ -1,84 +0,0 @@ -import withPadding from '../../../.storybook/decorators/with-padding'; -import readme from './readme.md'; -import { defineComponent, ref } from '@vue/composition-api'; - -export default { - title: 'Components / Modal', - parameters: { - notes: readme, - }, - decorators: [withPadding], -}; - -export const basic = () => - defineComponent({ - setup() { - const active = ref(false); - return { active }; - }, - template: ` -
- - - -

Hello world!

- - -
- -
- `, - }); - -export const withNav = () => - defineComponent({ - setup() { - const active = ref(false); - const current = ref(['hello']); - return { active, current }; - }, - template: ` -
- - - - - - - -

Hello world!

-
- - -

I'm a modal with tabs

-
-
- - - -
- -
- `, - }); diff --git a/app/src/components/v-modal/v-modal.test.ts b/app/src/components/v-modal/v-modal.test.ts deleted file mode 100644 index 944a497925..0000000000 --- a/app/src/components/v-modal/v-modal.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { shallowMount, createLocalVue } from '@vue/test-utils'; -import VueCompositionAPI from '@vue/composition-api'; - -import VModal from './v-modal.vue'; -import VDialog from '@/components/v-dialog/'; -import VIcon from '@/components/v-icon/'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); -localVue.component('v-dialog', VDialog); -localVue.component('v-icon', VIcon); - -describe('Components / Modal', () => { - it('Renders', () => { - const component = shallowMount(VModal, { - localVue, - propsData: { - title: 'My Modal', - }, - }); - - expect(component.isVueInstance()).toBe(true); - }); -}); diff --git a/app/src/components/v-upload/v-upload.vue b/app/src/components/v-upload/v-upload.vue index 0b7a9ef4a7..0b0d3b69e8 100644 --- a/app/src/components/v-upload/v-upload.vue +++ b/app/src/components/v-upload/v-upload.vue @@ -52,7 +52,7 @@ - import { defineComponent, ref, computed, watch } from '@vue/composition-api'; import uploadFiles from '@/utils/upload-files'; -import ModalCollection from '@/views/private/components/modal-collection'; +import DrawerCollection from '@/views/private/components/drawer-collection'; import api from '@/api'; import useItem from '@/composables/use-item'; export default defineComponent({ - components: { ModalCollection }, + components: { DrawerCollection }, props: { multiple: { type: Boolean, diff --git a/app/src/interfaces/file/file.vue b/app/src/interfaces/file/file.vue index a44af12941..f1ef5bd0f6 100644 --- a/app/src/interfaces/file/file.vue +++ b/app/src/interfaces/file/file.vue @@ -79,7 +79,7 @@ - import { defineComponent, ref, watch, computed } from '@vue/composition-api'; -import ModalCollection from '@/views/private/components/modal-collection'; +import DrawerCollection from '@/views/private/components/drawer-collection'; import api from '@/api'; import readableMimeType from '@/utils/readable-mime-type'; import getRootPath from '@/utils/get-root-path'; @@ -124,7 +124,7 @@ type FileInfo = { }; export default defineComponent({ - components: { ModalCollection }, + components: { DrawerCollection }, props: { value: { type: String, diff --git a/app/src/interfaces/files/files.vue b/app/src/interfaces/files/files.vue index 816816208f..78daf1b616 100644 --- a/app/src/interfaces/files/files.vue +++ b/app/src/interfaces/files/files.vue @@ -34,7 +34,7 @@
- - import { defineComponent, ref, computed, toRefs, PropType } from '@vue/composition-api'; import { Header as TableHeader } from '@/components/v-table/types'; -import ModalCollection from '@/views/private/components/modal-collection'; -import ModalItem from '@/views/private/components/modal-item'; +import DrawerCollection from '@/views/private/components/drawer-collection'; +import DrawerItem from '@/views/private/components/drawer-item'; import { get } from 'lodash'; import i18n from '@/lang'; @@ -83,7 +83,7 @@ import usePreview from '@/interfaces/many-to-many/use-preview'; import useEdit from '@/interfaces/many-to-many/use-edit'; export default defineComponent({ - components: { ModalCollection, ModalItem }, + components: { DrawerCollection, DrawerItem }, props: { primaryKey: { type: [Number, String], diff --git a/app/src/interfaces/many-to-many/many-to-many.vue b/app/src/interfaces/many-to-many/many-to-many.vue index 76f944c5a4..b7d55d7990 100644 --- a/app/src/interfaces/many-to-many/many-to-many.vue +++ b/app/src/interfaces/many-to-many/many-to-many.vue @@ -38,7 +38,7 @@ - - import { defineComponent, ref, computed, watch, PropType, toRefs } from '@vue/composition-api'; -import ModalItem from '@/views/private/components/modal-item'; -import ModalCollection from '@/views/private/components/modal-collection'; +import DrawerItem from '@/views/private/components/drawer-item'; +import DrawerCollection from '@/views/private/components/drawer-collection'; import { get } from 'lodash'; import useActions from './use-actions'; @@ -75,7 +75,7 @@ import useEdit from './use-edit'; import useSelection from './use-selection'; export default defineComponent({ - components: { ModalItem, ModalCollection }, + components: { DrawerItem, DrawerCollection }, props: { value: { type: Array as PropType<(number | string | Record)[] | null>, diff --git a/app/src/interfaces/many-to-one/many-to-one.vue b/app/src/interfaces/many-to-one/many-to-one.vue index 7691ea4c1a..b1ebb701be 100644 --- a/app/src/interfaces/many-to-one/many-to-one.vue +++ b/app/src/interfaces/many-to-one/many-to-one.vue @@ -82,7 +82,7 @@ - - - - )[] | null>, diff --git a/app/src/interfaces/user/user.vue b/app/src/interfaces/user/user.vue index d27b434db9..a8da9f1a2d 100644 --- a/app/src/interfaces/user/user.vue +++ b/app/src/interfaces/user/user.vue @@ -72,7 +72,7 @@ - -
- - + + diff --git a/app/src/layouts/tabular/tabular.vue b/app/src/layouts/tabular/tabular.vue index ea4f236ef1..5b44c8e8ea 100644 --- a/app/src/layouts/tabular/tabular.vue +++ b/app/src/layouts/tabular/tabular.vue @@ -49,8 +49,8 @@ - - + + diff --git a/app/src/modules/activity/routes/collection.vue b/app/src/modules/activity/routes/collection.vue index 88db83f952..295a2b47fd 100644 --- a/app/src/modules/activity/routes/collection.vue +++ b/app/src/modules/activity/routes/collection.vue @@ -31,12 +31,12 @@ - @@ -47,8 +47,8 @@ import ActivityNavigation from '../components/navigation.vue'; import { i18n } from '@/lang'; import usePreset from '@/composables/use-preset'; import marked from 'marked'; -import FilterDrawerDetail from '@/views/private/components/filter-drawer-detail'; -import LayoutDrawerDetail from '@/views/private/components/layout-drawer-detail'; +import FilterSidebarDetail from '@/views/private/components/filter-sidebar-detail'; +import LayoutSidebarDetail from '@/views/private/components/layout-sidebar-detail'; import SearchInput from '@/views/private/components/search-input'; import { nanoid } from 'nanoid'; @@ -58,7 +58,7 @@ type Item = { export default defineComponent({ name: 'activity-collection', - components: { ActivityNavigation, FilterDrawerDetail, LayoutDrawerDetail, SearchInput }, + components: { ActivityNavigation, FilterSidebarDetail, LayoutSidebarDetail, SearchInput }, props: { primaryKey: { type: String, diff --git a/app/src/modules/activity/routes/item.vue b/app/src/modules/activity/routes/item.vue index 7be7b344a8..dbe60c6285 100644 --- a/app/src/modules/activity/routes/item.vue +++ b/app/src/modules/activity/routes/item.vue @@ -1,14 +1,14 @@