Colors for lists and namespaces (#74)

Show colors for namespaces bigger

Show colors for lists and namespaces

Add changing color for lists

Add changing color for namespace

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/74
This commit is contained in:
konrad 2020-03-25 21:27:29 +00:00
parent 51de1fe880
commit cafb960c8d
8 changed files with 84 additions and 6 deletions

View file

@ -134,7 +134,8 @@
</span> </span>
</router-link> </router-link>
<label class="menu-label" v-tooltip="n.name + ' (' + n.lists.length + ')'" :for="n.id + 'checker'"> <label class="menu-label" v-tooltip="n.name + ' (' + n.lists.length + ')'" :for="n.id + 'checker'">
<span> <span class="name">
<span class="color-bubble" v-if="n.hex_color !== ''" :style="{ backgroundColor: n.hex_color }"></span>
{{n.name}} ({{n.lists.length}}) {{n.name}} ({{n.lists.length}})
</span> </span>
<span class="is-archived" v-if="n.is_archived"> <span class="is-archived" v-if="n.is_archived">
@ -147,7 +148,10 @@
<ul class="menu-list can-be-hidden" > <ul class="menu-list can-be-hidden" >
<li v-for="l in n.lists" :key="l.id"> <li v-for="l in n.lists" :key="l.id">
<router-link :to="{ name: 'showList', params: { id: l.id} }"> <router-link :to="{ name: 'showList', params: { id: l.id} }">
<span>{{l.title}}</span> <span class="name">
<span class="color-bubble" v-if="l.hex_color !== ''" :style="{ backgroundColor: l.hex_color }"></span>
{{l.title}}
</span>
<span class="is-archived" v-if="l.is_archived"> <span class="is-archived" v-if="l.is_archived">
Archived Archived
</span> </span>

View file

@ -34,6 +34,18 @@
</label> </label>
</div> </div>
</div> </div>
<div class="field">
<label class="label">Color</label>
<div class="control">
<verte
v-model="list.hex_color"
menuPosition="top"
picker="square"
model="hex"
:enableAlpha="false"
:rgbSliders="true"/>
</div>
</div>
</form> </form>
<div class="columns bigbuttons"> <div class="columns bigbuttons">
@ -71,6 +83,9 @@
</template> </template>
<script> <script>
import verte from 'verte'
import 'verte/dist/verte.css'
import auth from '../../auth' import auth from '../../auth'
import router from '../../router' import router from '../../router'
import manageSharing from '../sharing/userTeam' import manageSharing from '../sharing/userTeam'
@ -97,6 +112,7 @@
components: { components: {
LinkSharing, LinkSharing,
manageSharing, manageSharing,
verte,
}, },
beforeMount() { beforeMount() {
// Check if the user is already logged in, if so, redirect him to the homepage // Check if the user is already logged in, if so, redirect him to the homepage

View file

@ -42,6 +42,18 @@
</div> </div>
</div> </div>
</div> </div>
<div class="field">
<label class="label">Color</label>
<div class="control">
<verte
v-model="namespace.hex_color"
menuPosition="top"
picker="square"
model="hex"
:enableAlpha="false"
:rgbSliders="true"/>
</div>
</div>
</form> </form>
<div class="columns bigbuttons"> <div class="columns bigbuttons">
@ -77,6 +89,9 @@
</template> </template>
<script> <script>
import verte from 'verte'
import 'verte/dist/verte.css'
import auth from '../../auth' import auth from '../../auth'
import router from '../../router' import router from '../../router'
import manageSharing from '../sharing/userTeam' import manageSharing from '../sharing/userTeam'
@ -100,6 +115,7 @@
}, },
components: { components: {
manageSharing, manageSharing,
verte,
}, },
beforeMount() { beforeMount() {
// Check if the user is already logged in, if so, redirect him to the homepage // Check if the user is already logged in, if so, redirect him to the homepage

View file

@ -7,6 +7,10 @@ export default class ListModel extends AbstractModel {
constructor(data) { constructor(data) {
super(data) super(data)
if (this.hex_color !== '' && this.hex_color.substring(0, 1) !== '#') {
this.hex_color = '#' + this.hex_color
}
// Make all tasks to task models // Make all tasks to task models
this.tasks = this.tasks.map(t => { this.tasks = this.tasks.map(t => {
return new TaskModel(t) return new TaskModel(t)
@ -28,6 +32,7 @@ export default class ListModel extends AbstractModel {
tasks: [], tasks: [],
namespaceID: 0, namespaceID: 0,
is_archived: false, is_archived: false,
hex_color: '',
created: null, created: null,
updated: null, updated: null,

View file

@ -6,6 +6,10 @@ export default class NamespaceModel extends AbstractModel {
constructor(data) { constructor(data) {
super(data) super(data)
if (this.hex_color !== '' && this.hex_color.substring(0, 1) !== '#') {
this.hex_color = '#' + this.hex_color
}
this.lists = this.lists.map(l => { this.lists = this.lists.map(l => {
return new ListModel(l) return new ListModel(l)
}) })
@ -24,6 +28,7 @@ export default class NamespaceModel extends AbstractModel {
owner: UserModel, owner: UserModel,
lists: [], lists: [],
is_archived: false, is_archived: false,
hex_color: '',
created: null, created: null,
updated: null, updated: null,

View file

@ -28,6 +28,12 @@ export default class ListService extends AbstractService {
model.tasks = model.tasks.map(task => { model.tasks = model.tasks.map(task => {
return taskService.beforeUpdate(task) return taskService.beforeUpdate(task)
}) })
model.hex_color = model.hex_color.substring(1, 7)
return model return model
} }
beforeCreate(list) {
list.hex_color = list.hex_color.substring(1, 7)
return list
}
} }

View file

@ -22,4 +22,14 @@ export default class NamespaceService extends AbstractService {
modelFactory(data) { modelFactory(data) {
return new NamespaceModel(data) return new NamespaceModel(data)
} }
beforeUpdate(namespace) {
namespace.hex_color = namespace.hex_color.substring(1, 7)
return namespace
}
beforeCreate(namespace) {
namespace.hex_color = namespace.hex_color.substring(1, 7)
return namespace
}
} }

View file

@ -130,9 +130,18 @@
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
span:not(.icon) { span.name:not(.icon) {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
.color-bubble {
display: inline-block;
vertical-align: initial;
width: 12px;
height: 12px;
border-radius: 100%;
margin-right: 2px;
}
} }
.is-archived { .is-archived {
@ -149,9 +158,16 @@
} }
} }
.menu-label .is-archived { .menu-label {
.color-bubble {
width: 14px !important;
height: 14px !important;
}
.is-archived {
min-width: 85px; min-width: 85px;
} }
}
.nsettings{ .nsettings{
float: right; float: right;