wip
This commit is contained in:
		
							parent
							
								
									0f36bbd3d4
								
							
						
					
					
						commit
						9fde555cc3
					
				
					 7 changed files with 87 additions and 83 deletions
				
			
		| 
						 | 
					@ -187,6 +187,7 @@
 | 
				
			||||||
		"vue-loader": "^14.1.1",
 | 
							"vue-loader": "^14.1.1",
 | 
				
			||||||
		"vue-router": "^3.0.1",
 | 
							"vue-router": "^3.0.1",
 | 
				
			||||||
		"vue-template-compiler": "^2.5.13",
 | 
							"vue-template-compiler": "^2.5.13",
 | 
				
			||||||
 | 
							"vuedraggable": "^2.16.0",
 | 
				
			||||||
		"web-push": "3.2.5",
 | 
							"web-push": "3.2.5",
 | 
				
			||||||
		"webpack": "3.10.0",
 | 
							"webpack": "3.10.0",
 | 
				
			||||||
		"webpack-replace-loader": "^1.3.0",
 | 
							"webpack-replace-loader": "^1.3.0",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,38 +31,51 @@
 | 
				
			||||||
				<button @click="addWidget">追加</button>
 | 
									<button @click="addWidget">追加</button>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="trash">
 | 
								<div class="trash">
 | 
				
			||||||
				<div ref="trash"></div>
 | 
									<x-draggable v-model="trash" :options="{ group: 'x' }" @add="onTrash"></x-draggable>
 | 
				
			||||||
				<p>ゴミ箱</p>
 | 
									<p>ゴミ箱</p>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	<div class="main">
 | 
						<div class="main">
 | 
				
			||||||
		<div v-for="place in ['left', 'main', 'right']" :class="place" :ref="place" :data-place="place">
 | 
							<template v-if="customize">
 | 
				
			||||||
			<template v-if="place != 'main'">
 | 
								<x-draggable v-for="place in ['left', 'right']"
 | 
				
			||||||
				<template v-for="widget in widgets[place]">
 | 
									:list="widgets[place]"
 | 
				
			||||||
					<div class="customize-container" v-if="customize" :key="widget.id" @contextmenu.stop.prevent="onWidgetContextmenu(widget.id)" :data-widget-id="widget.id">
 | 
									:class="place"
 | 
				
			||||||
						<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id"/>
 | 
									:data-place="place"
 | 
				
			||||||
					</div>
 | 
									:options="{ group: 'x', animation: 150 }"
 | 
				
			||||||
					<template v-else>
 | 
									@sort="onWidgetSort"
 | 
				
			||||||
						<component :is="`mkw-${widget.name}`" :key="widget.id" :widget="widget" :ref="widget.id" @chosen="warp"/>
 | 
									:key="place"
 | 
				
			||||||
					</template>
 | 
								>
 | 
				
			||||||
				</template>
 | 
									<div v-for="widget in widgets[place]" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="onWidgetContextmenu(widget.id)">
 | 
				
			||||||
			</template>
 | 
										<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id"/>
 | 
				
			||||||
			<template v-else>
 | 
									</div>
 | 
				
			||||||
				<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="place == 'main' && mode == 'timeline'"/>
 | 
								</x-draggable>
 | 
				
			||||||
				<mk-mentions @loaded="onTlLoaded" v-if="place == 'main' && mode == 'mentions'"/>
 | 
								<div class="main">
 | 
				
			||||||
			</template>
 | 
									<mk-timeline ref="tl" @loaded="onTlLoaded"/>
 | 
				
			||||||
		</div>
 | 
								</div>
 | 
				
			||||||
 | 
							</template>
 | 
				
			||||||
 | 
							<template v-else>
 | 
				
			||||||
 | 
								<div v-for="place in ['left', 'right']" :class="place">
 | 
				
			||||||
 | 
									<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :widget="widget" @chosen="warp"/>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
								<div class="main">
 | 
				
			||||||
 | 
									<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
 | 
				
			||||||
 | 
									<mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</template>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import * as XDraggable from 'vuedraggable';
 | 
				
			||||||
import * as uuid from 'uuid';
 | 
					import * as uuid from 'uuid';
 | 
				
			||||||
import * as Sortable from 'sortablejs';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						components: {
 | 
				
			||||||
 | 
							XDraggable
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		customize: Boolean,
 | 
							customize: Boolean,
 | 
				
			||||||
		mode: {
 | 
							mode: {
 | 
				
			||||||
| 
						 | 
					@ -72,50 +85,49 @@ export default Vue.extend({
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	data() {
 | 
						data() {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			widgetAdderSelected: null
 | 
								widgetAdderSelected: null,
 | 
				
			||||||
 | 
								trash: [],
 | 
				
			||||||
 | 
								widgets: {
 | 
				
			||||||
 | 
									left: [],
 | 
				
			||||||
 | 
									right: []
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		home(): any {
 | 
							home: {
 | 
				
			||||||
			//#region 互換性のため
 | 
								get(): any[] {
 | 
				
			||||||
			(this as any).os.i.client_settings.home.forEach(w => {
 | 
									//#region 互換性のため
 | 
				
			||||||
				if (w.name == 'rss-reader') w.name = 'rss';
 | 
									(this as any).os.i.client_settings.home.forEach(w => {
 | 
				
			||||||
				if (w.name == 'user-recommendation') w.name = 'users';
 | 
										if (w.name == 'rss-reader') w.name = 'rss';
 | 
				
			||||||
				if (w.name == 'recommended-polls') w.name = 'polls';
 | 
										if (w.name == 'user-recommendation') w.name = 'users';
 | 
				
			||||||
			});
 | 
										if (w.name == 'recommended-polls') w.name = 'polls';
 | 
				
			||||||
			//#endregion
 | 
									});
 | 
				
			||||||
			return (this as any).os.i.client_settings.home;
 | 
									//#endregion
 | 
				
			||||||
 | 
									return (this as any).os.i.client_settings.home;
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								set(value) {
 | 
				
			||||||
 | 
									(this as any).os.i.client_settings.home = value;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		leftWidgets(): any {
 | 
							left(): any[] {
 | 
				
			||||||
			return this.home.filter(w => w.place == 'left');
 | 
								return this.home.filter(w => w.place == 'left');
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		rightWidgets(): any {
 | 
							right(): any[] {
 | 
				
			||||||
			return this.home.filter(w => w.place == 'right');
 | 
								return this.home.filter(w => w.place == 'right');
 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		widgets(): any {
 | 
					 | 
				
			||||||
			return {
 | 
					 | 
				
			||||||
				left: this.leftWidgets,
 | 
					 | 
				
			||||||
				right: this.rightWidgets,
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		leftEl(): Element {
 | 
					 | 
				
			||||||
			return (this.$refs.left as Element[])[0];
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		rightEl(): Element {
 | 
					 | 
				
			||||||
			return (this.$refs.right as Element[])[0];
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						created() {
 | 
				
			||||||
 | 
							this.widgets.left = this.left;
 | 
				
			||||||
 | 
							this.widgets.right = this.right;
 | 
				
			||||||
 | 
							this.$watch('os.i', i => {
 | 
				
			||||||
 | 
								this.widgets.left = this.left;
 | 
				
			||||||
 | 
								this.widgets.right = this.right;
 | 
				
			||||||
 | 
							}, {
 | 
				
			||||||
 | 
								deep: true
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	mounted() {
 | 
						mounted() {
 | 
				
			||||||
		this.$nextTick(() => {
 | 
							this.$nextTick(() => {
 | 
				
			||||||
			if (!this.customize) {
 | 
					 | 
				
			||||||
				if (this.leftEl.children.length == 0) {
 | 
					 | 
				
			||||||
					this.leftEl.parentNode.removeChild(this.leftEl);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if (this.rightEl.children.length == 0) {
 | 
					 | 
				
			||||||
					this.rightEl.parentNode.removeChild(this.rightEl);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (this.customize) {
 | 
								if (this.customize) {
 | 
				
			||||||
				(this as any).apis.dialog({
 | 
									(this as any).apis.dialog({
 | 
				
			||||||
					title: '%fa:info-circle%カスタマイズのヒント',
 | 
										title: '%fa:info-circle%カスタマイズのヒント',
 | 
				
			||||||
| 
						 | 
					@ -127,30 +139,6 @@ export default Vue.extend({
 | 
				
			||||||
						text: 'Got it!'
 | 
											text: 'Got it!'
 | 
				
			||||||
					}]
 | 
										}]
 | 
				
			||||||
				});
 | 
									});
 | 
				
			||||||
 | 
					 | 
				
			||||||
				const sortableOption = {
 | 
					 | 
				
			||||||
					group: 'kyoppie',
 | 
					 | 
				
			||||||
					animation: 150,
 | 
					 | 
				
			||||||
					onMove: evt => {
 | 
					 | 
				
			||||||
						const id = evt.dragged.getAttribute('data-widget-id');
 | 
					 | 
				
			||||||
						this.home.find(w => w.id == id).place = evt.to.getAttribute('data-place');
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
					onSort: () => {
 | 
					 | 
				
			||||||
						this.saveHome();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				new Sortable(this.leftEl, sortableOption);
 | 
					 | 
				
			||||||
				new Sortable(this.rightEl, sortableOption);
 | 
					 | 
				
			||||||
				new Sortable(this.$refs.trash, Object.assign({}, sortableOption, {
 | 
					 | 
				
			||||||
					onAdd: evt => {
 | 
					 | 
				
			||||||
						const el = evt.item;
 | 
					 | 
				
			||||||
						const id = el.getAttribute('data-widget-id');
 | 
					 | 
				
			||||||
						el.parentNode.removeChild(el);
 | 
					 | 
				
			||||||
						this.home = this.home.filter(w => w.id != id);
 | 
					 | 
				
			||||||
						this.saveHome();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}));
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -161,6 +149,12 @@ export default Vue.extend({
 | 
				
			||||||
		onWidgetContextmenu(widgetId) {
 | 
							onWidgetContextmenu(widgetId) {
 | 
				
			||||||
			(this.$refs[widgetId] as any)[0].func();
 | 
								(this.$refs[widgetId] as any)[0].func();
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							onWidgetSort() {
 | 
				
			||||||
 | 
								this.saveHome();
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							onTrash(evt) {
 | 
				
			||||||
 | 
								this.saveHome();
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		addWidget() {
 | 
							addWidget() {
 | 
				
			||||||
			const widget = {
 | 
								const widget = {
 | 
				
			||||||
				name: this.widgetAdderSelected,
 | 
									name: this.widgetAdderSelected,
 | 
				
			||||||
| 
						 | 
					@ -169,11 +163,15 @@ export default Vue.extend({
 | 
				
			||||||
				data: {}
 | 
									data: {}
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			this.home.unshift(widget);
 | 
								this.widgets.left.unshift(widget);
 | 
				
			||||||
 | 
					 | 
				
			||||||
			this.saveHome();
 | 
								this.saveHome();
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		saveHome() {
 | 
							saveHome() {
 | 
				
			||||||
 | 
								const left = this.widgets.left;
 | 
				
			||||||
 | 
								const right = this.widgets.right;
 | 
				
			||||||
 | 
								this.home = left.concat(right);
 | 
				
			||||||
 | 
								left.forEach(w => w.place = 'left');
 | 
				
			||||||
 | 
								right.forEach(w => w.place = 'right');
 | 
				
			||||||
			(this as any).api('i/update_home', {
 | 
								(this as any).api('i/update_home', {
 | 
				
			||||||
				home: this.home
 | 
									home: this.home
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
| 
						 | 
					@ -282,6 +280,7 @@ export default Vue.extend({
 | 
				
			||||||
		> .main
 | 
							> .main
 | 
				
			||||||
			padding 16px
 | 
								padding 16px
 | 
				
			||||||
			width calc(100% - 275px * 2)
 | 
								width calc(100% - 275px * 2)
 | 
				
			||||||
 | 
								order 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> *:not(main)
 | 
							> *:not(main)
 | 
				
			||||||
			width 275px
 | 
								width 275px
 | 
				
			||||||
| 
						 | 
					@ -292,9 +291,11 @@ export default Vue.extend({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .left
 | 
							> .left
 | 
				
			||||||
			padding-left 16px
 | 
								padding-left 16px
 | 
				
			||||||
 | 
								order 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .right
 | 
							> .right
 | 
				
			||||||
			padding-right 16px
 | 
								padding-right 16px
 | 
				
			||||||
 | 
								order 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		@media (max-width 1100px)
 | 
							@media (max-width 1100px)
 | 
				
			||||||
			> *:not(main)
 | 
								> *:not(main)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,7 @@ import wNotifications from './widgets/notifications.vue';
 | 
				
			||||||
import wBroadcast from './widgets/broadcast.vue';
 | 
					import wBroadcast from './widgets/broadcast.vue';
 | 
				
			||||||
import wTimemachine from './widgets/timemachine.vue';
 | 
					import wTimemachine from './widgets/timemachine.vue';
 | 
				
			||||||
import wProfile from './widgets/profile.vue';
 | 
					import wProfile from './widgets/profile.vue';
 | 
				
			||||||
 | 
					import wServer from './widgets/server.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Vue.component('mk-ui', ui);
 | 
					Vue.component('mk-ui', ui);
 | 
				
			||||||
Vue.component('mk-ui-notification', uiNotification);
 | 
					Vue.component('mk-ui-notification', uiNotification);
 | 
				
			||||||
| 
						 | 
					@ -73,3 +74,4 @@ Vue.component('mkw-notifications', wNotifications);
 | 
				
			||||||
Vue.component('mkw-broadcast', wBroadcast);
 | 
					Vue.component('mkw-broadcast', wBroadcast);
 | 
				
			||||||
Vue.component('mkw-timemachine', wTimemachine);
 | 
					Vue.component('mkw-timemachine', wTimemachine);
 | 
				
			||||||
Vue.component('mkw-profile', wProfile);
 | 
					Vue.component('mkw-profile', wProfile);
 | 
				
			||||||
 | 
					Vue.component('mkw-server', wServer);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +53,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import uuid from 'uuid';
 | 
					import * as uuid from 'uuid';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	props: ['connection'],
 | 
						props: ['connection'],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,8 @@
 | 
				
			||||||
	<x-pie class="pie" :value="usage"/>
 | 
						<x-pie class="pie" :value="usage"/>
 | 
				
			||||||
	<div>
 | 
						<div>
 | 
				
			||||||
		<p>%fa:microchip%CPU</p>
 | 
							<p>%fa:microchip%CPU</p>
 | 
				
			||||||
		<p>{{ cores }} Cores</p>
 | 
							<p>{{ meta.cpu.cores }} Cores</p>
 | 
				
			||||||
		<p>{{ model }}</p>
 | 
							<p>{{ meta.cpu.model }}</p>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,8 +14,8 @@ export default Vue.extend({
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="info" scoped>
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
.uptimes
 | 
					.info
 | 
				
			||||||
	padding 10px 14px
 | 
						padding 10px 14px
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> p
 | 
						> p
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
		fill="none"
 | 
							fill="none"
 | 
				
			||||||
		stroke-width="0.1"
 | 
							stroke-width="0.1"
 | 
				
			||||||
		:stroke="color"/>
 | 
							:stroke="color"/>
 | 
				
			||||||
	<text x="50%" y="50%" dy="0.05" text-anchor="middle">{{ (p * 100).toFixed(0) }}%</text>
 | 
						<text x="50%" y="50%" dy="0.05" text-anchor="middle">{{ (value * 100).toFixed(0) }}%</text>
 | 
				
			||||||
</svg>
 | 
					</svg>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue