@@ -106,6 +106,7 @@
methods: {
+
async getItems(query)
{
if (!query)
@@ -129,6 +130,17 @@
},
+ getLink(item)
+ {
+ if (item.isFolder)
+ {
+ return { name: 'media', params: { parentId: item.id } };
+ }
+
+ return { name: 'media-edit', params: { id: item.id } };
+ },
+
+
onSelected(selection)
{
this.selected = selection;
diff --git a/zero.Backoffice.UI/app/modules/media/plugin.ts b/zero.Backoffice.UI/app/modules/media/plugin.ts
index f092c3cb..b53aa60e 100644
--- a/zero.Backoffice.UI/app/modules/media/plugin.ts
+++ b/zero.Backoffice.UI/app/modules/media/plugin.ts
@@ -6,7 +6,10 @@ export default {
install(app: ZeroPluginOptions)
{
- //app.vue.component('ui-countrypicker', defineAsyncComponent(() => import('./ui-countrypicker.vue')));
+ app.vue.component('ui-mediapicker', defineAsyncComponent(() => import('./components/ui-mediapicker.vue')));
+
+ app.fieldType('media', defineAsyncComponent(() => import('./components/field-mediapicker.vue')));
+ app.fieldType('image', defineAsyncComponent(() => import('./components/field-imagepicker.vue')));
app.route({ name: 'media', path: '/media/:parentId?', component: () => import('./pages/overview/overview.vue'), props: true });
app.route({ name: 'media-edit', path: '/media/edit/:id?', component: () => import('./pages/detail/detail.vue'), props: true });
@@ -14,4 +17,37 @@ export default {
//app.schema('countries', () => import('./schemas/list'));
app.schema('media:edit', () => import('./schemas/editor'));
}
-} as ZeroPlugin;
\ No newline at end of file
+} as ZeroPlugin;
+
+
+declare module 'zero/schemas'
+{
+ export interface ZeroEditorField
+ {
+ /**
+ * Renders a media picker
+ * @param {MediaFieldOptions} [options] - Custom options
+ */
+ media(options?: MediaFieldOptions): ZeroEditorField;
+
+ /**
+ * Renders an image picker
+ * @param {MediaBaseFieldOptions} [options] - Custom options
+ */
+ image(options?: MediaBaseFieldOptions): ZeroEditorField;
+ }
+
+ export type MediaTypeFor = 'all' | 'images' | 'videos' | 'documents';
+
+ export interface MediaBaseFieldOptions extends PickerFieldOptions
+ {
+ disableSelect?: boolean;
+ disableUpload?: boolean;
+ fileExtensions?: Array;
+ }
+
+ export interface MediaFieldOptions extends MediaBaseFieldOptions
+ {
+ for?: MediaTypeFor;
+ }
+}
\ No newline at end of file
diff --git a/zero.Backoffice.UI/app/modules/media/ui-countrypicker.vue b/zero.Backoffice.UI/app/modules/media/ui-countrypicker.vue
deleted file mode 100644
index 34356f88..00000000
--- a/zero.Backoffice.UI/app/modules/media/ui-countrypicker.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- country picker
-
-
-
-
-
-
\ No newline at end of file
diff --git a/zero.Backoffice.UI/app/modules/settings/demo.ts b/zero.Backoffice.UI/app/modules/settings/demo.ts
index e4364e10..de7df2a1 100644
--- a/zero.Backoffice.UI/app/modules/settings/demo.ts
+++ b/zero.Backoffice.UI/app/modules/settings/demo.ts
@@ -6,6 +6,8 @@ const editor = new ZeroEditor('demo');
editor.field('name', { label: 'Text' }).text({ maxLength: 120 });
editor.field('isActive', { label: 'Toggle', horizontal: true }).toggle();
+editor.field('images', { label: 'Images' }).image({ limit: 4 });
+editor.field('docs', { label: 'Documents' }).media({ limit: 1 });
editor.field('number', { label: 'Number' }).number();
editor.field('output', { label: 'Number' }).output();
editor.field('rte', { label: 'Number' }).rte();
diff --git a/zero.Backoffice.UI/app/modules/settings/demo.vue b/zero.Backoffice.UI/app/modules/settings/demo.vue
index 4eada026..40dad0e9 100644
--- a/zero.Backoffice.UI/app/modules/settings/demo.vue
+++ b/zero.Backoffice.UI/app/modules/settings/demo.vue
@@ -19,7 +19,9 @@
output: 'This is an output',
rte: '',
textarea: 'A textarea\nfor you',
- state: 'red'
+ state: 'red',
+ images: ['media.zpkxfjkgciom', 'media.w2cntwlrcueb', 'media.1waxp46ho8hu'],
+ docs: null
},
route: 'demo',
disabled: false
diff --git a/zero.Core/Media/MediaFileSystem.cs b/zero.Core/Media/MediaFileSystem.cs
index 05fdecb4..2d0e5294 100644
--- a/zero.Core/Media/MediaFileSystem.cs
+++ b/zero.Core/Media/MediaFileSystem.cs
@@ -14,6 +14,10 @@ public class MediaFileSystem : PhysicalFileSystem, IMediaFileSystem
///
public override string MapToPublicPath(string path)
{
+ if (path.IsNullOrEmpty())
+ {
+ return null;
+ }
return PublicPathPrefix + path.TrimStart('/');
}
}