Skip to content
Commits on Source (3)
...@@ -102,10 +102,13 @@ import { ThemeService } from "./services/theme.service"; ...@@ -102,10 +102,13 @@ import { ThemeService } from "./services/theme.service";
import { HorizontalInfiniteScroll } from "./components/infinite-scroll/horizontal-infinite-scroll.component"; import { HorizontalInfiniteScroll } from "./components/infinite-scroll/horizontal-infinite-scroll.component";
import { ReferralsLinksComponent } from '../modules/wallet/tokens/referrals/links/links.component'; import { ReferralsLinksComponent } from '../modules/wallet/tokens/referrals/links/links.component';
import { ShareModalComponent } from '../modules/modals/share/share'; import { ShareModalComponent } from '../modules/modals/share/share';
import { DraggableListComponent } from "./components/draggable-list/list.component";
import { DndModule } from "ngx-drag-drop";
@NgModule({ @NgModule({
imports: [ imports: [
NgCommonModule, NgCommonModule,
DndModule,
RouterModule, RouterModule,
FormsModule, FormsModule,
ReactiveFormsModule, ReactiveFormsModule,
...@@ -195,6 +198,7 @@ import { ShareModalComponent } from '../modules/modals/share/share'; ...@@ -195,6 +198,7 @@ import { ShareModalComponent } from '../modules/modals/share/share';
SwitchComponent, SwitchComponent,
FeaturedContentComponent, FeaturedContentComponent,
DraggableListComponent,
], ],
exports: [ exports: [
MINDS_PIPES, MINDS_PIPES,
...@@ -278,17 +282,20 @@ import { ShareModalComponent } from '../modules/modals/share/share'; ...@@ -278,17 +282,20 @@ import { ShareModalComponent } from '../modules/modals/share/share';
SwitchComponent, SwitchComponent,
NSFWSelectorComponent, NSFWSelectorComponent,
FeaturedContentComponent, FeaturedContentComponent,
DraggableListComponent,
], ],
providers: [ providers: [
{ {
provide: AttachmentService, provide: AttachmentService,
useFactory: AttachmentService._, useFactory: AttachmentService._,
deps: [Session, Client, Upload, HttpClient ] deps: [Session, Client, Upload, HttpClient]
}, },
{ {
provide: UpdateMarkersService, provide: UpdateMarkersService,
useFactory: (_http, _session, _sockets) => { return new UpdateMarkersService(_http, _session, _sockets); }, useFactory: (_http, _session, _sockets) => {
deps: [ MindsHttpClient, Session, SocketsService ], return new UpdateMarkersService(_http, _session, _sockets);
},
deps: [MindsHttpClient, Session, SocketsService],
}, },
{ {
provide: MindsHttpClient, provide: MindsHttpClient,
...@@ -298,22 +305,22 @@ import { ShareModalComponent } from '../modules/modals/share/share'; ...@@ -298,22 +305,22 @@ import { ShareModalComponent } from '../modules/modals/share/share';
{ {
provide: NSFWSelectorCreatorService, provide: NSFWSelectorCreatorService,
useFactory: (_storage) => new NSFWSelectorCreatorService(_storage), useFactory: (_storage) => new NSFWSelectorCreatorService(_storage),
deps: [ Storage ], deps: [Storage],
}, },
{ {
provide: NSFWSelectorConsumerService, provide: NSFWSelectorConsumerService,
useFactory: (_storage) => new NSFWSelectorConsumerService(_storage), useFactory: (_storage) => new NSFWSelectorConsumerService(_storage),
deps: [ Storage ], deps: [Storage],
}, },
{ {
provide: BoostedContentService, provide: BoostedContentService,
useFactory: (client, session, entitiesService, blockListService, settingsService) => new BoostedContentService(client, session, entitiesService, blockListService, settingsService), useFactory: (client, session, entitiesService, blockListService, settingsService) => new BoostedContentService(client, session, entitiesService, blockListService, settingsService),
deps: [ Client, Session, EntitiesService, BlockListService, SettingsService ] deps: [Client, Session, EntitiesService, BlockListService, SettingsService]
}, },
{ {
provide: FeaturedContentService, provide: FeaturedContentService,
useFactory: boostedContentService => new FeaturedContentService(boostedContentService), useFactory: boostedContentService => new FeaturedContentService(boostedContentService),
deps: [ FeedsService ], deps: [FeedsService],
} }
], ],
entryComponents: [ entryComponents: [
......
@import 'themes';
m-draggable-list {
ul {
list-style: none;
padding: 0;
margin: 0;
li {
padding: 8px;
border: 1px solid #ddd;
display: flex;
align-items: center;
.handle {
@include m-theme() {
color: themed($grey-600);
}
}
}
}
}
import { ChangeDetectorRef, Component, ContentChild, Input, TemplateRef } from '@angular/core';
import { DndDropEvent, DropEffect, EffectAllowed } from 'ngx-drag-drop';
@Component({
selector: 'm-draggable-list',
template: `
<ul
dndDropzone
[dndHorizontal]="false"
[dndEffectAllowed]="dndEffectAllowed"
(dndDrop)="onDrop($event, data)"
>
<div class="dndPlaceholder" dndPlaceholderRef
style="min-height:72px;border:1px dashed green;background-color:rgba(0, 0, 0, 0.1)"></div>
<li
*ngFor="let item of data; let i = index; trackBy: trackByFunction"
[dndDraggable]="item"
[dndEffectAllowed]="'move'"
(dndCopied)="onDragged(item, data, 'copy')"
(dndLinked)="onDragged(item, data, 'link')"
(dndMoved)="onDragged(item, data, 'move')"
(dndEnd)="onDragEnd(item, data, $event)"
(dndCanceled)="onDragged(item, data, 'none')"
>
<i class="handle material-icons" dndHandle>reorder</i>
<ng-container [ngTemplateOutlet]="template" [ngTemplateOutletContext]="{item: item, i: i}"></ng-container>
</li>
</ul>
`,
})
export class DraggableListComponent {
@Input() data: Array<any>;
@Input() dndEffectAllowed: EffectAllowed = 'move';
@ContentChild(TemplateRef, { static: false }) template: TemplateRef<any>;
trackByFunction(index, item) {
return item.tag + index;
}
onDragged(item: any, list: any[], effect: DropEffect) {
// const index = list.indexOf(item);
// list.splice(index, 1);
}
onDragEnd(item: any, list: any[], event: DragEvent) {
const index = list.indexOf(item);
list.splice(index, 1);
console.warn('drag ended');
}
onDrop(event: DndDropEvent, list?: any[]) {
if (list
&& (event.dropEffect === "copy"
|| event.dropEffect === "move")) {
let index = event.index;
if (typeof index === "undefined") {
index = list.length;
}
list.splice(index, 0, event.data);
}
}
}
...@@ -138,6 +138,7 @@ ...@@ -138,6 +138,7 @@
Set up your category filter hashtags here. Set up your category filter hashtags here.
</p> </p>
<div class="m-pro--settings--field" *ngFor="let tag of settings.tag_list; let i = index"> <div class="m-pro--settings--field" *ngFor="let tag of settings.tag_list; let i = index">
<label for="headline" i18n>Hashtag #{{ i + 1 }}</label> <label for="headline" i18n>Hashtag #{{ i + 1 }}</label>
...@@ -162,6 +163,36 @@ ...@@ -162,6 +163,36 @@
</div> </div>
</div> </div>
<!--<m-draggable-list
[data]="settings.tag_list">
<ng-template let-tag="item" let-i="i">
<div class="m-pro&#45;&#45;settings&#45;&#45;field">
<label for="headline" i18n>Hashtag #{{ i + 1 }}</label>
<div class="m-pro&#45;&#45;settings&#45;&#45;flex-inputs">
<input
type="text"
placeholder="Label"
[id]="'tag-label-' + i"
[name]="'tag[' + i + '][label]'"
[(ngModel)]="tag.label"
i18n-placeholder
>
<input
type="text"
placeholder="#hashtag"
[id]="'tag-tag-' + i"
[name]="'tag[' + i + '][tag]'"
[(ngModel)]="tag.tag"
i18n-placeholder
>
</div>
</div>
</ng-template>
</m-draggable-list>-->
<div class="m-pro--settings--field"> <div class="m-pro--settings--field">
<button <button
class="m-btn m-btn--slim" class="m-btn m-btn--slim"
...@@ -169,7 +200,8 @@ ...@@ -169,7 +200,8 @@
[disabled]="inProgress" [disabled]="inProgress"
(click)="addBlankTag()" (click)="addBlankTag()"
i18n i18n
>+ Add Tag</button> >+ Add Tag
</button>
</div> </div>
</ng-template> </ng-template>
......
...@@ -3,6 +3,7 @@ import { ProService } from '../pro.service'; ...@@ -3,6 +3,7 @@ import { ProService } from '../pro.service';
import { Session } from '../../../services/session'; import { Session } from '../../../services/session';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { MindsTitle } from '../../../services/ux/title'; import { MindsTitle } from '../../../services/ux/title';
import { DndDropEvent, DropEffect } from 'ngx-drag-drop';
@Component({ @Component({
selector: 'm-pro--settings', selector: 'm-pro--settings',
...@@ -19,6 +20,9 @@ export class ProSettingsComponent implements OnInit { ...@@ -19,6 +20,9 @@ export class ProSettingsComponent implements OnInit {
currentTab: 'general' | 'theme' | 'hashtags' | 'footer' | 'cancel' = 'general'; currentTab: 'general' | 'theme' | 'hashtags' | 'footer' | 'cancel' = 'general';
private currentDraggableEvent: DragEvent;
private currentDragEffectMsg: string;
constructor( constructor(
protected service: ProService, protected service: ProService,
protected session: Session, protected session: Session,
...@@ -86,4 +90,43 @@ export class ProSettingsComponent implements OnInit { ...@@ -86,4 +90,43 @@ export class ProSettingsComponent implements OnInit {
get previewRoute() { get previewRoute() {
return ['/pro', this.session.getLoggedInUser().username]; return ['/pro', this.session.getLoggedInUser().username];
} }
onDragStart(event: DragEvent) {
this.currentDragEffectMsg = "";
this.currentDraggableEvent = event;
}
onDragged(item: any, list: any[], effect: DropEffect) {
this.currentDragEffectMsg = `Drag ended with effect "${effect}"!`;
if (effect === "move") {
const index = list.indexOf(item);
list.splice(index, 1);
}
}
onDragEnd(event: DragEvent) {
this.currentDraggableEvent = event;
}
onDrop(event: DndDropEvent, list?: any[]) {
if (list
&& (event.dropEffect === "copy"
|| event.dropEffect === "move")) {
let index = event.index;
if (typeof index === "undefined") {
index = list.length;
}
list.splice(index, 0, event.data);
}
}
} }