Browse Source

Sorting fixed.

pull/303/head
Sebastian 8 years ago
parent
commit
e8f77b9fbe
  1. 50
      src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.html
  2. 54
      src/Squidex/app/features/administration/pages/users/users-page.component.html
  3. 2
      src/Squidex/app/features/content/module.ts
  4. 28
      src/Squidex/app/features/content/pages/contents/contents-page.component.html
  5. 18
      src/Squidex/app/features/content/shared/contents-selector.component.html
  6. 21
      src/Squidex/app/features/content/shared/references-editor.component.html
  7. 96
      src/Squidex/app/features/rules/pages/events/rule-events-page.component.html
  8. 80
      src/Squidex/app/features/rules/pages/rules/rules-page.component.html
  9. 2
      src/Squidex/app/features/schemas/pages/schema/field.component.html
  10. 2
      src/Squidex/app/features/schemas/pages/schema/schema-page.component.html
  11. 42
      src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html
  12. 61
      src/Squidex/app/framework/angular/sorted-dnd.directive.ts
  13. 7
      src/Squidex/app/framework/angular/sorted.directive.ts
  14. 1
      src/Squidex/app/framework/declarations.ts
  15. 3
      src/Squidex/app/framework/module.ts
  16. 4
      src/Squidex/app/theme/_bootstrap.scss

50
src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.html

@ -29,33 +29,31 @@
</tr>
</thead>
<tbody>
<ng-template ngFor let-eventConsumer [ngForOf]="eventConsumersState.eventConsumers | async" [ngForTrackBy]="trackByEventConsumer">
<tr [class.faulted]="eventConsumer.error && eventConsumer.error.length > 0">
<td class="auto-auto">
<span class="truncate">
<i class="faulted-icon icon icon-bug" (click)="showError(eventConsumer)" [class.hidden]="!eventConsumer.error || eventConsumer.error.length === 0"></i>
<tbody *ngFor="let eventConsumer of eventConsumersState.eventConsumers | async; trackBy: trackByEventConsumer">
<tr [class.faulted]="eventConsumer.error && eventConsumer.error.length > 0">
<td class="auto-auto">
<span class="truncate">
<i class="faulted-icon icon icon-bug" (click)="showError(eventConsumer)" [class.hidden]="!eventConsumer.error || eventConsumer.error.length === 0"></i>
{{eventConsumer.name}}
</span>
</td>
<td class="cell-auto-right">
<span>{{eventConsumer.position}}</span>
</td>
<td class="cell-actions-lg">
<button class="btn btn-link" (click)="reset(eventConsumer)" *ngIf="!eventConsumer.isResetting" title="Reset Event Consumer">
<i class="icon icon-reset"></i>
</button>
<button class="btn btn-link" (click)="start(eventConsumer)" *ngIf="eventConsumer.isStopped" title="Start Event Consumer">
<i class="icon icon-play"></i>
</button>
<button class="btn btn-link" (click)="stop(eventConsumer)" *ngIf="!eventConsumer.isStopped" title="Stop Event Consumer">
<i class="icon icon-pause"></i>
</button>
</td>
</tr>
<tr class="spacer"></tr>
</ng-template>
{{eventConsumer.name}}
</span>
</td>
<td class="cell-auto-right">
<span>{{eventConsumer.position}}</span>
</td>
<td class="cell-actions-lg">
<button class="btn btn-link" (click)="reset(eventConsumer)" *ngIf="!eventConsumer.isResetting" title="Reset Event Consumer">
<i class="icon icon-reset"></i>
</button>
<button class="btn btn-link" (click)="start(eventConsumer)" *ngIf="eventConsumer.isStopped" title="Start Event Consumer">
<i class="icon icon-play"></i>
</button>
<button class="btn btn-link" (click)="stop(eventConsumer)" *ngIf="!eventConsumer.isStopped" title="Stop Event Consumer">
<i class="icon icon-pause"></i>
</button>
</td>
</tr>
<tr class="spacer"></tr>
</tbody>
</table>
</ng-container>

54
src/Squidex/app/features/administration/pages/users/users-page.component.html

@ -48,35 +48,33 @@
<div class="grid-content">
<div sqxIgnoreScrollbar>
<table class="table table-items table-fixed">
<tbody>
<ng-template ngFor let-userInfo [ngForOf]="usersState.users | async" [ngForTrackBy]="trackByUser">
<tr [routerLink]="userInfo.user.id" routerLinkActive="active">
<td class="cell-user">
<img class="user-picture" [attr.title]="userInfo.user.name" [attr.src]="userInfo.user | sqxUserDtoPicture" />
</td>
<td class="cell-auto">
<span class="user-name table-cell">{{userInfo.user.displayName}}</span>
</td>
<td class="cell-auto">
<span class="user-email table-cell">{{userInfo.user.email}}</span>
</td>
<td class="cell-actions">
<ng-container *ngIf="!userInfo.isCurrentUser">
<button class="btn btn-link" (click)="lock(userInfo.user); $event.stopPropagation();" *ngIf="!userInfo.user.isLocked" title="Lock User">
<i class="icon icon-unlocked"></i>
</button>
<button class="btn btn-link" (click)="unlock(userInfo.user); $event.stopPropagation();" *ngIf="userInfo.user.isLocked" title="Unlock User">
<i class="icon icon-lock"></i>
</button>
</ng-container>
<button *ngIf="userInfo.isCurrentUser" class="btn btn-link invisible">
&nbsp;
<tbody *ngFor="let userInfo of usersState.users | async; trackBy: trackByUser">
<tr [routerLink]="userInfo.user.id" routerLinkActive="active">
<td class="cell-user">
<img class="user-picture" [attr.title]="userInfo.user.name" [attr.src]="userInfo.user | sqxUserDtoPicture" />
</td>
<td class="cell-auto">
<span class="user-name table-cell">{{userInfo.user.displayName}}</span>
</td>
<td class="cell-auto">
<span class="user-email table-cell">{{userInfo.user.email}}</span>
</td>
<td class="cell-actions">
<ng-container *ngIf="!userInfo.isCurrentUser">
<button class="btn btn-link" (click)="lock(userInfo.user); $event.stopPropagation();" *ngIf="!userInfo.user.isLocked" title="Lock User">
<i class="icon icon-unlocked"></i>
</button>
<button class="btn btn-link" (click)="unlock(userInfo.user); $event.stopPropagation();" *ngIf="userInfo.user.isLocked" title="Unlock User">
<i class="icon icon-lock"></i>
</button>
</td>
</tr>
<tr class="spacer"></tr>
</ng-template>
</ng-container>
<button *ngIf="userInfo.isCurrentUser" class="btn btn-link invisible">
&nbsp;
</button>
</td>
</tr>
<tr class="spacer"></tr>
</tbody>
</table>
</div>

2
src/Squidex/app/features/content/module.ts

@ -7,6 +7,7 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DndModule } from 'ng2-dnd';
import {
CanDeactivateGuard,
@ -81,6 +82,7 @@ const routes: Routes = [
@NgModule({
imports: [
DndModule,
SqxFrameworkModule,
SqxSharedModule,
RouterModule.forChild(routes)

28
src/Squidex/app/features/content/pages/contents/contents-page.component.html

@ -97,21 +97,19 @@
<div class="grid-content">
<div sqxIgnoreScrollbar>
<table class="table table-items table-fixed">
<tbody>
<ng-template ngFor let-content [ngForOf]="contentsState.contents | async" [ngForTrackBy]="trackByContent">
<tr [sqxContent]="content" [routerLink]="[content.id]" routerLinkActive="active"
[language]="language"
[schema]="schema"
[selected]="isItemSelected(content)"
(selectedChange)="selectItem(content, $event)"
(unpublishing)="unpublish(content)"
(publishing)="publish(content)"
(archiving)="archive(content)"
(restoring)="restore(content)"
(deleting)="delete(content)">
</tr>
<tr class="spacer"></tr>
</ng-template>
<tbody *ngFor="let content of contentsState.contents | async; trackBy: trackByContent">
<tr [sqxContent]="content" [routerLink]="[content.id]" routerLinkActive="active"
[language]="language"
[schema]="schema"
[selected]="isItemSelected(content)"
(selectedChange)="selectItem(content, $event)"
(unpublishing)="unpublish(content)"
(publishing)="publish(content)"
(archiving)="archive(content)"
(restoring)="restore(content)"
(deleting)="delete(content)">
</tr>
<tr class="spacer"></tr>
</tbody>
</table>
</div>

18
src/Squidex/app/features/content/shared/contents-selector.component.html

@ -49,16 +49,14 @@
<div class="grid-content">
<div sqxIgnoreScrollbar>
<table class="table table-items table-fixed">
<tbody>
<ng-template ngFor let-content [ngForOf]="contentsState.contents | async" [ngForTrackBy]="trackByContent">
<tr [sqxContent]="content"
[selected]="isItemSelected(content)"
(selectedChange)="selectContent(content)"
[language]="language"
[schema]="schema"
isReadOnly="true"></tr>
<tr class="spacer"></tr>
</ng-template>
<tbody *ngFor="let content of contentsState.contents | async; trackBy: trackByContent">
<tr [sqxContent]="content"
[selected]="isItemSelected(content)"
(selectedChange)="selectContent(content)"
[language]="language"
[schema]="schema"
isReadOnly="true"></tr>
<tr class="spacer"></tr>
</tbody>
</table>
</div>

21
src/Squidex/app/features/content/shared/references-editor.component.html

@ -6,17 +6,16 @@
</div>
</div>
<table class="table table-items table-fixed" [class.disabled]="isDisabled" *ngIf="schema && contentItems && contentItems.length > 0">
<tbody [sqxSortModel]="contentItems.mutableValues" (sqxSorted)="sort($event)">
<ng-template ngFor let-content [ngForOf]="contentItems">
<tr [sqxContent]="content"
[language]="language"
[schema]="schema"
(deleting)="remove(content)"
isReadOnly="true"
isReference="true"></tr>
<tr class="spacer"></tr>
</ng-template>
<table class="table table-items table-fixed" [class.disabled]="isDisabled" *ngIf="schema && contentItems && contentItems.length > 0"
dnd-sortable-container [sortableData]="contentItems.mutableValues">
<tbody *ngFor="let content of contentItems; let i = index" dnd-sortable [sortableIndex]="i" (sqxSortedDnd)="sort($event)">
<tr [sqxContent]="content"
[language]="language"
[schema]="schema"
(deleting)="remove(content)"
isReadOnly="true"
isReference="true"></tr>
<tr class="spacer"></tr>
</tbody>
</table>
</ng-container>

96
src/Squidex/app/features/rules/pages/events/rule-events-page.component.html

@ -33,58 +33,56 @@
</tr>
</thead>
<tbody>
<ng-template ngFor let-event [ngForOf]="ruleEventsState.ruleEvents | async" [ngForOf]="trackByRuleEvent">
<tr [class.expanded]="selectedEventId === event.id">
<td class="cell-label">
<span class="badge badge-pill badge-{{event.jobResult | sqxRuleEventBadgeClass}}">{{event.jobResult}}</span>
</td>
<td class="cell-40">
<span class="truncate">{{event.eventName}}</span>
</td>
<td class="cell-60">
<span class="truncate">{{event.description}}</span>
</td>
<td class="cell-time">
<small class="item-modified">{{event.created | sqxFromNow}}</small>
</td>
<td class="cell-actions">
<button type="button" class="btn btn-secondary table-items-edit-button" [class.active]="selectedEventId === event.id" (click)="selectEvent(event.id)">
<i class="icon-settings"></i>
</button>
</td>
</tr>
<tr *ngIf="selectedEventId === event.id">
<td colspan="5">
<div class="event-header">
<h3>Last Invocation</h3>
<tbody *ngFor="let event of ruleEventsState.ruleEvents | async; trackBy: trackByRuleEvent">
<tr [class.expanded]="selectedEventId === event.id">
<td class="cell-label">
<span class="badge badge-pill badge-{{event.jobResult | sqxRuleEventBadgeClass}}">{{event.jobResult}}</span>
</td>
<td class="cell-40">
<span class="truncate">{{event.eventName}}</span>
</td>
<td class="cell-60">
<span class="truncate">{{event.description}}</span>
</td>
<td class="cell-time">
<small class="item-modified">{{event.created | sqxFromNow}}</small>
</td>
<td class="cell-actions">
<button type="button" class="btn btn-secondary table-items-edit-button" [class.active]="selectedEventId === event.id" (click)="selectEvent(event.id)">
<i class="icon-settings"></i>
</button>
</td>
</tr>
<tr *ngIf="selectedEventId === event.id">
<td colspan="5">
<div class="event-header">
<h3>Last Invocation</h3>
</div>
<div class="row event-stats">
<div class="col-3">
<span class="badge badge-pill badge-{{event.result | sqxRuleEventBadgeClass}}">{{event.result}}</span>
</div>
<div class="col-3">
Attempts: {{event.numCalls}}
</div>
<div class="row event-stats">
<div class="col-3">
<span class="badge badge-pill badge-{{event.result | sqxRuleEventBadgeClass}}">{{event.result}}</span>
</div>
<div class="col-3">
Attempts: {{event.numCalls}}
</div>
<div class="col-3">
Next: <ng-container *ngIf="event.nextAttempt">{{event.nextAttempt | sqxFromNow}}</ng-container>
</div>
<div class="col-3 text-right">
<button class="btn btn-success btn-sm" (click)="enqueue(event)">
Enqueue
</button>
</div>
<div class="col-3">
Next: <ng-container *ngIf="event.nextAttempt">{{event.nextAttempt | sqxFromNow}}</ng-container>
</div>
<div class="row">
<div class="col-12">
<textarea class="event-dump form-control" readonly>{{event.lastDump}}</textarea>
</div>
<div class="col-3 text-right">
<button class="btn btn-success btn-sm" (click)="enqueue(event)">
Enqueue
</button>
</div>
</td>
</tr>
<tr class="spacer"></tr>
</ng-template>
</div>
<div class="row">
<div class="col-12">
<textarea class="event-dump form-control" readonly>{{event.lastDump}}</textarea>
</div>
</div>
</td>
</tr>
<tr class="spacer"></tr>
</tbody>
</table>

80
src/Squidex/app/features/rules/pages/rules/rules-page.component.html

@ -29,49 +29,47 @@
</div>
<table class="table table-items table-fixed" *ngIf="rules.length > 0">
<tbody>
<ng-template ngFor let-rule [ngForOf]="rules" [ngForTrackBy]="trackByRule">
<tr>
<td class="cell-separator">
<h3>If</h3>
</td>
<td class="cell-auto">
<span class="rule-element rule-element-{{rule.triggerType}}" (click)="editTrigger(rule)">
<span class="rule-element-icon">
<i class="icon-trigger-{{rule.triggerType}}"></i>
</span>
<span class="rule-element-text">
{{ruleTriggers[rule.triggerType].name}}
</span>
<tbody *ngFor="let rule of rules; trackBy: trackByRule">
<tr>
<td class="cell-separator">
<h3>If</h3>
</td>
<td class="cell-auto">
<span class="rule-element rule-element-{{rule.triggerType}}" (click)="editTrigger(rule)">
<span class="rule-element-icon">
<i class="icon-trigger-{{rule.triggerType}}"></i>
</span>
</td>
<td class="cell-separator">
<h3>then</h3>
</td>
<td class="cell-auto">
<span class="rule-element rule-element-{{rule.actionType}}" (click)="editAction(rule)">
<span class="rule-element-icon">
<i class="icon-action-{{rule.actionType}}"></i>
</span>
<span class="rule-element-text">
{{ruleActions[rule.actionType].name}}
</span>
<span class="rule-element-text">
{{ruleTriggers[rule.triggerType].name}}
</span>
</td>
<td class="cell-actions">
<sqx-toggle [ngModel]="rule.isEnabled" (ngModelChange)="toggle(rule)"></sqx-toggle>
</td>
<td class="cell-actions">
<button type="button" class="btn btn-link btn-danger"
(sqxConfirmClick)="delete(rule)"
confirmTitle="Delete rule"
confirmText="Do you really want to delete the rule?">
<i class="icon-bin2"></i>
</button>
</td>
</tr>
<tr class="spacer"></tr>
</ng-template>
</span>
</td>
<td class="cell-separator">
<h3>then</h3>
</td>
<td class="cell-auto">
<span class="rule-element rule-element-{{rule.actionType}}" (click)="editAction(rule)">
<span class="rule-element-icon">
<i class="icon-action-{{rule.actionType}}"></i>
</span>
<span class="rule-element-text">
{{ruleActions[rule.actionType].name}}
</span>
</span>
</td>
<td class="cell-actions">
<sqx-toggle [ngModel]="rule.isEnabled" (ngModelChange)="toggle(rule)"></sqx-toggle>
</td>
<td class="cell-actions">
<button type="button" class="btn btn-link btn-danger"
(sqxConfirmClick)="delete(rule)"
confirmTitle="Delete rule"
confirmText="Do you really want to delete the rule?">
<i class="icon-bin2"></i>
</button>
</td>
</tr>
<tr class="spacer"></tr>
</tbody>
</table>
</ng-container>

2
src/Squidex/app/features/schemas/pages/schema/field.component.html

@ -23,7 +23,7 @@
</button>
<div class="dropdown dropdown-options">
<button type="button" class="btn btn-link btn-secondary" (click)="dropdown.toggle()" [class.active]="dropdown.isOpen | async" #optionsButton>
<button type="button" class="btn btn-link btn-secondary ml-1" (click)="dropdown.toggle()" [class.active]="dropdown.isOpen | async" #optionsButton>
<i class="icon-dots"></i>
</button>
<div class="dropdown-menu" *sqxModalView="dropdown" [sqxModalTarget]="optionsButton" @fade>

2
src/Squidex/app/features/schemas/pages/schema/schema-page.component.html

@ -20,7 +20,7 @@
</div>
<div class="dropdown dropdown-options">
<button type="button" class="btn btn-link btn-secondary" (click)="editOptionsDropdown.toggle()" [class.active]="editOptionsDropdown.isOpen | async" #buttonOptions>
<button type="button" class="btn btn-link btn-secondary ml-1" (click)="editOptionsDropdown.toggle()" [class.active]="editOptionsDropdown.isOpen | async" #buttonOptions>
<i class="icon-dots"></i>
</button>
<div class="dropdown-menu" *sqxModalView="editOptionsDropdown" [sqxModalTarget]="buttonOptions" @fade>

42
src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html

@ -23,28 +23,26 @@
<ng-container *ngIf="contributorsState.contributors | async; let contributors">
<table class="table table-items table-fixed">
<tbody>
<ng-template ngFor let-contributorInfo [ngForOf]="contributors" [ngForTrackBy]="trackByContributor">
<tr>
<td class="cell-user">
<img class="user-picture" [attr.title]="contributorInfo.contributor.contributorId | sqxUserName" [attr.src]="contributorInfo.contributor.contributorId | sqxUserPicture" />
</td>
<td class="cell-auto">
<span class="user-name table-cell">{{contributorInfo.contributor.contributorId | sqxUserName}}</span>
</td>
<td class="cell-time">
<select class="form-control" [ngModel]="contributorInfo.contributor.permission" (ngModelChange)="changePermission(contributorInfo.contributor, $event)" [disabled]="contributorInfo.isCurrentUser">
<option *ngFor="let permission of usersPermissions" [ngValue]="permission">{{permission}}</option>
</select>
</td>
<td class="cell-actions">
<button *ngIf="!contributorInfo.isCurrentUser" type="button" class="btn btn-link btn-danger" (click)="remove(contributorInfo.contributor)">
<i class="icon-bin2"></i>
</button>
</td>
</tr>
<tr class="spacer"></tr>
</ng-template>
<tbody *ngFor="let contributorInfo of contributors; trackBy: trackByContributor">
<tr>
<td class="cell-user">
<img class="user-picture" [attr.title]="contributorInfo.contributor.contributorId | sqxUserName" [attr.src]="contributorInfo.contributor.contributorId | sqxUserPicture" />
</td>
<td class="cell-auto">
<span class="user-name table-cell">{{contributorInfo.contributor.contributorId | sqxUserName}}</span>
</td>
<td class="cell-time">
<select class="form-control" [ngModel]="contributorInfo.contributor.permission" (ngModelChange)="changePermission(contributorInfo.contributor, $event)" [disabled]="contributorInfo.isCurrentUser">
<option *ngFor="let permission of usersPermissions" [ngValue]="permission">{{permission}}</option>
</select>
</td>
<td class="cell-actions">
<button *ngIf="!contributorInfo.isCurrentUser" type="button" class="btn btn-link btn-danger" (click)="remove(contributorInfo.contributor)">
<i class="icon-bin2"></i>
</button>
</td>
</tr>
<tr class="spacer"></tr>
</tbody>
</table>

61
src/Squidex/app/framework/angular/sorted-dnd.directive.ts

@ -0,0 +1,61 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Directive, EventEmitter, Output } from '@angular/core';
import {
DragDropSortableService,
SortableComponent,
SortableContainer
} from 'ng2-dnd';
@Directive({
selector: '[sqxSortedDnd]'
})
export class SortedDndDirective {
private oldArray: any[];
@Output('sqxSortedDnd')
public sorted = new EventEmitter<Array<any>>();
constructor(
sortableComponent: SortableComponent,
sortableContainer: SortableContainer,
sortableDragDropService: DragDropSortableService
) {
const oldDragStartCallback = sortableComponent._onDragStartCallback.bind(sortableComponent);
if (Array.isArray(sortableContainer.sortableData)) {
sortableComponent._onDragStartCallback = () => {
oldDragStartCallback();
this.oldArray = [...<any>sortableContainer.sortableData];
};
const oldDropCallback = sortableComponent._onDropCallback.bind(sortableComponent);
sortableComponent._onDropCallback = (event: Event) => {
oldDropCallback(event);
if (sortableDragDropService.isDragged) {
const newArray: any[] = <any>sortableContainer.sortableData;
const oldArray = this.oldArray;
if (newArray && oldArray && newArray.length === oldArray.length) {
for (let i = 0; i < oldArray.length; i++) {
if (oldArray[i] !== newArray[i]) {
this.sorted.emit(newArray);
break;
}
}
}
}
};
}
}
}

7
src/Squidex/app/framework/angular/sorted.directive.ts

@ -22,6 +22,9 @@ export class SortedDirective implements OnDestroy, OnInit {
@Input()
public handleClass: string | null = null;
@Input()
public mirrorToSelf: boolean;
@Output('sqxSorted')
public sorted = new EventEmitter<any[]>();
@ -57,7 +60,9 @@ export class SortedDirective implements OnDestroy, OnInit {
}
return false;
}
},
mirrorContainer: this.mirrorToSelf ? this.elementRef.nativeElement : document.body
});
let dragIndex: number;

1
src/Squidex/app/framework/declarations.ts

@ -55,6 +55,7 @@ export * from './angular/popup-link.directive';
export * from './angular/scroll-active.directive';
export * from './angular/shortcut.component';
export * from './angular/sorted.directive';
export * from './angular/sorted-dnd.directive';
export * from './angular/template-wrapper.directive';
export * from './angular/title.component';
export * from './angular/user-report.component';

3
src/Squidex/app/framework/module.ts

@ -65,6 +65,7 @@ import {
ShortTimePipe,
SliderComponent,
SortedDirective,
SortedDndDirective,
StarsComponent,
TagEditorComponent,
TemplateWrapperDirective,
@ -129,6 +130,7 @@ import {
ShortTimePipe,
SliderComponent,
SortedDirective,
SortedDndDirective,
StarsComponent,
TagEditorComponent,
TemplateWrapperDirective,
@ -188,6 +190,7 @@ import {
ShortTimePipe,
SliderComponent,
SortedDirective,
SortedDndDirective,
StarsComponent,
TagEditorComponent,
TemplateWrapperDirective,

4
src/Squidex/app/theme/_bootstrap.scss

@ -537,4 +537,8 @@ a {
}
}
}
}
.table tbody + tbody {
border: 0;
}
Loading…
Cancel
Save