diff --git a/src/app/components/modal/modals/blocks/blocks.component.html b/src/app/components/modal/modals/blocks/blocks.component.html index 425c480..2e9270a 100644 --- a/src/app/components/modal/modals/blocks/blocks.component.html +++ b/src/app/components/modal/modals/blocks/blocks.component.html @@ -1,50 +1,63 @@
-
+
+

View item

-
- edit +
+ +
+ edit +
-
+
@@ -60,22 +73,24 @@ [alwaysDropShadow]="true" [onlyShadowBorder]="true" [placeholder]="'Tag this item…'" - (value)="editedValues.tag = $event" + (value)="top(editedValues).tag = $event" >
- +
- +
+ +
-
+
diff --git a/src/app/components/modal/modals/blocks/blocks.component.scss b/src/app/components/modal/modals/blocks/blocks.component.scss index 2ad1eb7..77cf427 100644 --- a/src/app/components/modal/modals/blocks/blocks.component.scss +++ b/src/app/components/modal/modals/blocks/blocks.component.scss @@ -37,6 +37,7 @@ max-width: 400px; @media (max-width: $mobile-width) { width: 300px; + opacity: 1 !important; } box-sizing: border-box; @@ -44,13 +45,17 @@ margin: calc(var(--large-padding) / 2); position: relative; + &.near-active { + cursor: pointer; + } + .mask { position: absolute; left: 0; top: 0; width: 100%; height: 100%; - z-index: 100; + z-index: 10000; @include card(); } @@ -59,68 +64,100 @@ margin-left: var(--large-padding); } - &.transparent { + &.placeholder { opacity: 0; + width: 1000px; + max-width: 1000px; } @include inner-spacing(var(--large-padding)); .header { @include center-child(); + position: relative; .exit { position: absolute; - left: var(--large-padding); + left: 0; @include exit(); } + + .block { + @include square(12px); + margin-right: 10px; + } } - .edit { + .bottom { + height: 32px; + @media (max-width: $mobile-width) { + height: 24px; + } + position: relative; - display: inline-block; - float: right; - opacity: 0.25; - cursor: pointer; - img { - @include square(16px); - } - - transition: opacity $short-animation-time; - - &:before { - content: ''; - display: block; + button { + margin: 0; position: absolute; - bottom: calc(-1 * #{$line-height}); - left: 0; - height: $line-height; - background-color: $text-color; - width: 0; - transition: width $long-animation-time; + left: 50%; + top: 50%; + transform: translateY(-50%) translateX(-50%); + + transition: opacity $short-animation-time; + + &.hidden { + opacity: 0; + } } - @media (min-width: $mobile-width) { - &:hover { - opacity: 0.5; + .edit { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + opacity: 0.25; + cursor: pointer; + + img { + @include square(16px); } - &:hover { + + transition: opacity $short-animation-time; + + &:before { + content: ''; + display: block; + position: absolute; + bottom: calc(-1 * #{$line-height}); + left: 0; + height: $line-height; + background-color: $text-color; + width: 0; + transition: width $long-animation-time; + } + + @media (min-width: $mobile-width) { + &:hover { + opacity: 0.5; + } + &:hover { + &:before { + width: 100% !important; + } + } + } + + &.active { &:before { width: 100% !important; } } - } - &.active { - &:before { - width: 100% !important; + &.active { + opacity: 1; } } - - &.active { - opacity: 1; - } } } diff --git a/src/app/components/modal/modals/blocks/blocks.component.ts b/src/app/components/modal/modals/blocks/blocks.component.ts index 64f0671..6199a5a 100644 --- a/src/app/components/modal/modals/blocks/blocks.component.ts +++ b/src/app/components/modal/modals/blocks/blocks.component.ts @@ -6,9 +6,7 @@ import { Block } from '../../../../model/block'; import { IBlock } from '../../../../interfaces/persistance/block'; import { CancelService } from '../../../../services/cancel.service'; import { range } from 'src/app/utils/range'; -import { el } from '@angular/platform-browser/testing/src/browser_util'; - -const SWIPE_LIMIT = 0.35; +import { top } from 'src/app/utils/top'; @Component({ selector: 'app-blocks', @@ -17,10 +15,11 @@ const SWIPE_LIMIT = 0.35; }) export class BlocksComponent implements OnInit, OnDestroy { readonly range = range; + readonly top = top; tower: Tower; - editedValues: Partial; + editedValues: Array>; endOfScrollToken = 0; editMode = false; @@ -76,13 +75,16 @@ export class BlocksComponent implements OnInit, OnDestroy { this.onlyDone = onlyDone; this.subscription = tower$.subscribe(value => { this.tower = value; - setTimeout(() => this.scrollToChild(this.blocks.indexOf(startBlock) + 1, true)); - }); + this.editedValues = this.blocks.map(({ isDone, description, tag }) => ({ isDone, description, tag })); + this.editedValues.push({ + isDone: this.onlyDone, + description: '' + }); - this.editedValues = { - isDone: onlyDone, - description: '' - }; + setTimeout(() => + this.scrollToChild(startBlock ? this.blocks.indexOf(startBlock) + 1 : this.blocks.length + 1, true) + ); + }); } animateScroll() { @@ -106,8 +108,9 @@ export class BlocksComponent implements OnInit, OnDestroy { animate(cardStyle, maskStyle, t: number) { t = Math.min(1, Math.max(0, t)); + cardStyle.opacity = (1 - t / 1.5).toString(); maskStyle.opacity = Math.pow(t, 0.5).toString(); - maskStyle.display = t === 0 ? 'none' : 'block'; + maskStyle.display = t <= 0.1 ? 'none' : 'block'; } adjustPosition() { @@ -141,8 +144,13 @@ export class BlocksComponent implements OnInit, OnDestroy { } submitAdd() { - this.editedValues.created = new Date(); - this.tower.addBlock(this.editedValues as IBlock); + top(this.editedValues).created = new Date(); + this.tower.addBlock(top(this.editedValues) as IBlock); + this.modalService.submit(); + } + + submitChange() { + this.blocks[this.activeChild - 1].changeKeys(this.editedValues[this.activeChild - 1]); this.modalService.submit(); } diff --git a/src/app/components/shared/select-add/select-add.component.html b/src/app/components/shared/select-add/select-add.component.html index aa66c25..7983461 100644 --- a/src/app/components/shared/select-add/select-add.component.html +++ b/src/app/components/shared/select-add/select-add.component.html @@ -1,5 +1,8 @@ -
-
+
+

diff --git a/src/app/components/shared/select-add/select-add.component.scss b/src/app/components/shared/select-add/select-add.component.scss index 9920d6f..bc105ac 100644 --- a/src/app/components/shared/select-add/select-add.component.scss +++ b/src/app/components/shared/select-add/select-add.component.scss @@ -5,6 +5,12 @@ $inner-padding: var(--medium-padding); width: 100%; position: relative; + &.disabled { + .top { + cursor: not-allowed !important; + } + } + .top, .bottom { padding: $inner-padding; diff --git a/src/app/components/shared/select-add/select-add.component.ts b/src/app/components/shared/select-add/select-add.component.ts index 11cb8eb..c8d30e0 100644 --- a/src/app/components/shared/select-add/select-add.component.ts +++ b/src/app/components/shared/select-add/select-add.component.ts @@ -13,6 +13,7 @@ export class SelectAddComponent { @Input() alwaysDropShadow = false; @Input() onlyShadowBorder = false; @Input() editable = false; + @Input() disabled = false; @Input() set default(value: string) { this.selected = value; diff --git a/src/app/components/shared/toggle/toggle.component.html b/src/app/components/shared/toggle/toggle.component.html index 8026d79..6a3d19f 100644 --- a/src/app/components/shared/toggle/toggle.component.html +++ b/src/app/components/shared/toggle/toggle.component.html @@ -1,5 +1,7 @@ - + diff --git a/src/app/components/shared/toggle/toggle.component.scss b/src/app/components/shared/toggle/toggle.component.scss index 9ef51ea..ba5e531 100644 --- a/src/app/components/shared/toggle/toggle.component.scss +++ b/src/app/components/shared/toggle/toggle.component.scss @@ -24,46 +24,54 @@ } } - input[type='checkbox'] { - -webkit-appearance: none; - -moz-appearance: none; + label { + display: block; - width: 2 * $size; - height: $size; + input[type='checkbox'] { + -webkit-appearance: none; + -moz-appearance: none; - border-radius: 1000px; - box-shadow: $shadow-border; - - position: relative; - cursor: pointer; - - &:after { - content: ''; - position: absolute; - display: block; - left: 0; - - @include square($size); + width: 2 * $size; + height: $size; border-radius: 1000px; - background-color: $text-color; + box-shadow: $shadow-border; - transition: box-shadow $long-animation-time, left $long-animation-time, transform $long-animation-time; - } + position: relative; + cursor: pointer; - @media (min-width: $mobile-width) { - &:hover:after { - box-shadow: $shadow; - transform: translateX(2px); + &:after { + content: ''; + position: absolute; + display: block; + left: 0; + + @include square($size); + + border-radius: 1000px; + background-color: $text-color; + + transition: box-shadow $long-animation-time, left $long-animation-time, transform $long-animation-time; } - &.on:hover:after { - transform: translateX(-2px); + &.on:after { + left: $size; } } - &.on:after { - left: $size; + &:not(.disabled) { + input[type='checkbox'] { + @media (min-width: $mobile-width) { + &:hover:after { + box-shadow: $shadow; + transform: translateX(2px); + } + + &.on:hover:after { + transform: translateX(-2px); + } + } + } } } } diff --git a/src/app/components/shared/toggle/toggle.component.ts b/src/app/components/shared/toggle/toggle.component.ts index 29b6980..bff050b 100644 --- a/src/app/components/shared/toggle/toggle.component.ts +++ b/src/app/components/shared/toggle/toggle.component.ts @@ -9,6 +9,8 @@ export class ToggleComponent { @Input() beforeText: string; @Input() afterText: string; + @Input() disabled = false; + @Output() value: EventEmitter = new EventEmitter(); @Input() set default(value: boolean) { diff --git a/src/app/model/tower.ts b/src/app/model/tower.ts index edaca9e..4ba88ab 100644 --- a/src/app/model/tower.ts +++ b/src/app/model/tower.ts @@ -48,6 +48,10 @@ export class Tower extends Serializable implements ITower, TowerState { this.changeKeys({ name }); } + getColorOfBlock(block: Block): IColor { + return lighten((hash(block.tag) - 0.5) * 50, this.baseColor); + } + protected onAfterClone() { this.blocks.sort((a, b) => { return a.created.getTime() - b.created.getTime(); @@ -55,7 +59,7 @@ export class Tower extends Serializable implements ITower, TowerState { this.coloredBlocks = this.blocks.map(b => { const coloredBlock = b as ColoredBlock; - coloredBlock.color = lighten((hash(coloredBlock.tag) - 0.5) * 50, this.baseColor); + coloredBlock.color = this.getColorOfBlock(b); return coloredBlock; });