Commit 49434f95 authored by hanfeng zhang's avatar hanfeng zhang

Merge branc321h 'ls_tev'

parents c5ade2f8 ec56a687
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -14,6 +14,8 @@ import VConsole from 'vconsole'
Vue.config.productionTip = false
Vue.use(Dialog).use(Toast).use(Notify)
Vue.use(utils)
Vue.use(service)
Vue.use(utils).use(service)
Vue.prototype.$dsbridge = dsbridge
Vue.prototype.$global = global
......
......@@ -11,6 +11,46 @@ export const okrRoutes: Array<RouteConfig> = [
redirect: '/okr/okr-home',
children: [
{
path: 'kr-detail',
name: 'KRDetail',
component: () => import('@/views/okr/kr-detail.vue'),
meta: {
title: '客户数据收集'
}
},
{
path: 'kr-create',
name: 'KRCreate',
component: () => import('@/views/okr/kr-create.vue'),
meta: {
title: '新建Key Result'
}
},
{
path: 'o-objective',
name: 'OObjective',
component: () => import('@/views/okr/o-objective.vue'),
meta: {
title: '选择Objective'
}
},
{
path: 'o-search',
name: 'OSearch',
component: () => import('@/views/okr/o-search.vue'),
meta: {
title: ''
}
},
{
path: 'kr-state',
name: 'KRState',
component: () => import('@/views/okr/kr-state.vue'),
meta: {
title: '类型'
}
},
{
path: 'okr-home',
name: 'OkrHome',
component: () => import('@/views/okr/okr-home.vue'),
......@@ -28,13 +68,53 @@ export const okrRoutes: Array<RouteConfig> = [
},
{
path: 'key-result',
name: 'KeyResult',
component: () => import('@/views/okr/key-result.vue'),
path: 'o-avatorEdit',
name: 'OAvatorEdit',
component: () => import('@/views/okr/o-avatorEdit.vue'),
meta: {
title: '客户数据收集'
title: '增强公司内部管理制度'
}
},
{
path: 'o-priority',
name: 'OPriority',
component: () => import('@/views/okr/o-priority.vue'),
meta: {
title: '优先级'
}
},
{
path: 'o-accessibility',
name: 'OAccessibility',
component: () => import('@/views/okr/o-accessibility.vue'),
meta: {
title: '可访问性'
}
},
{
path: 'o-extendedAttribute',
name: 'OExtendedAttribute',
component: () => import('@/views/okr/o-extendedAttribute.vue'),
meta: {
title: '拓展属性'
}
},
{
path: 'o-describe',
name: 'ODescribe',
component: () => import('@/views/okr/o-describe.vue'),
meta: {
title: '描述'
}
},
{
path: 'o-relation',
name: 'ORelation',
component: () => import('@/views/okr/o-relation.vue'),
meta: {
title: '关联'
}
},
]
}
]
......@@ -234,8 +234,15 @@ export const teamRoutes: Array<RouteConfig> = [
meta: {
title: '加入团队'
}
},
{
path: 'import',
name: 'Import',
component: () => import('@/views/team/import.vue'),
meta:{
title:'批量导入'
}
},
]
}
]
......@@ -5,6 +5,7 @@ import Account from './moudles/Account'
import Apply from './moudles/Apply'
import Common from './moudles/Common'
// import { UserService } from './moudles/UserService'
export const service = {
staff: new Staff(),
enterprise: new Enterprise(),
......
export interface DataType{
telephone:string
codeType:string
}
\ No newline at end of file
<template>
<!-- 选择地点 -->
<!-- 内容 -->
<div class="py-2 px-4 border-b ">
<div class="flex items-center text-sm" @click="clickShow()">
<app-icon
icon-name="avator"
class-name="w-8 h-8 flex items-center"
/>
<div class="px-4">{{people}}</div>
</div>
<div v-if="show" class="mx-10">
<div v-for="(object,index) in objects" :key="index" class=" rounded" >
<div class="border-b pl-2.5 pr-1 w-full flex items-center text-sm" :class="classBorder(index)" @click="clickIcon(index)">
<app-icon
slot="icon"
:icon-name="checked === index+'' ? 'radio-checked': 'radio'"
class-name="w-6 h-6 mr-2 flex items-center"
/>
<div class="w-screen text-text-secondary">{{object}}</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
name: "OObjective",
components: {
'app-icon': () => import('@/components/common/Icon.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
show:false,
currentKey: 'leader',
people:'点击展开 再次点击姓名 收起',
objects:[
'部门日常任务',
'美的金融',
'提高公司知名度',
],
checked: '',
radio:''
}
},
computed: {
},
methods:{
clickShow(){
this.show=!this.show
},
clickIcon(index:number){
this.checked=index+''
},
classBorder(index:number){
if(index===this.objects.length-1){
return 'border-none pb-0'
}
if(index===0){
return 'mt-3'
}
}
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 内容 -->
<div class="py-2 px-2">
<div v-for="(object,index) in taskList" :key="index" class="rounded" >
<div class="border-b pl-2.5 pr-1 py-2 w-full flex items-center text-sm" @click="clickIcon(index)">
<app-icon
:icon-name="checked === index+'' ? 'radio-checked': 'radio'"
class-name="w-4 h-4 mr-6 flex items-center"
/>
<div class=" px-2 mr-2 rounded-full" :class="isColor(object)">{{object.typeName}}</div>
<div >{{object.thing}}</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue, { PropType } from 'vue'
interface Task {
id:number
type: 'urgent' | 'important' |'common' ,
typeName: string,
thing: string
}
export default Vue.extend({
name: "Card",
components: {
'app-icon': () => import('@/components/common/Icon.vue'),
},
props: {
taskList: Array as PropType<Array<Task>>,
},
data() {
return {
checked:'',
}
},
computed: {
},
methods:{
clickIcon(index:number){
this.checked=index+''
},
isColor(object: {type: string, typeName: string,thing: string}){
if(object.type==='urgent'){
return 'border border-tag-red text-tag-red'
}else if(object.type==='important'){
return 'border border-tag-yellow text-tag-yellow'
}else if(object.type==='common'){
return 'border border-tag-primary text-tag-primary'
}
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<app-icon
slot="right"
icon-name="dot-h"
class-name="w-5 h-3 flex items-center "
@click="isShow()"
/>
<!-- 弹窗 -->
<van-action-sheet v-model="show" >
<div class="text-text-secondary px-6 ">
<div class="border-b py-3.5 ">分享到</div>
<div class="border-b py-3.5">移动关键节点</div>
<div class="border-b py-3.5">拷贝关键节点</div>
<div class="border-b py-3.5">删除</div>
<div class=" py-3.5">归档</div>
</div>
</van-action-sheet>
<!-- 内容 -->
<div class="pt-14 px-4 pb-16">
<c-cell label="关键节点名称">
<input slot="content" type="text" class="text-sm text-red-500 focus:text-text-primary" placeholder="请输入关键节点">
</c-cell>
<!-- 更多信息 -->
<group-cell class="mt-4" title="更多信息">
<c-cell title="所属目标" titleColor="text-sm text-text-secondary">
<div slot="right" class="flex items-center">
<div class="mr-2 text-sm text-red-500">{{object}}</div>
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
<c-cell title="执行人" titleColor="text-sm text-text-secondary">
<div slot="right" class="flex items-center">
<div class="mr-2 text-sm text-red-500">{{people}}</div>
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
<c-cell title="周期" titleColor="text-sm text-text-secondary">
<div slot="right" class="flex items-center">
<div class="mr-2 text-sm text-red-500">{{period}}</div>
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
<c-cell title="加权百分比" titleColor="text-sm text-text-secondary">
<div slot="right" class="mr-4 border rounded px-2 text-text-secondary flex justify-center">
<input type="number" class="text-sm w-6 text-center " min="0" max="100">%
</div>
</c-cell>
<c-cell title="优先级" titleColor="text-sm text-text-secondary">
<div slot="right">
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
<c-cell title="参与人员" titleColor="text-sm text-text-secondary">
<div slot="right">
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
<c-cell title="描述" titleColor="text-sm text-text-secondary">
<div slot="right">
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
</group-cell>
<!-- 拓展属性/其他信息 -->
<c-cell label="拓展属性" title="关键节点类型" titleColor="text-sm text-text-secondary" class="mt-4">
<div slot="right">
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
<c-cell label="其他信息" title="附件" titleColor="text-sm text-text-secondary" class="mt-4">
<div slot="right">
<app-icon
icon-name="right-arrow"
class-name="w-2 h-3 "
/>
</div>
</c-cell>
<!-- 按钮 -->
<div class="fixed bottom-0 left-0 w-full px-4 bg-common-bg py-1.5">
<c-button>
确认
</c-button>
</div>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
import { ActionSheet } from 'vant';
import { Icon } from 'vant';
Vue.use(Icon);
Vue.use(ActionSheet);
export default Vue.extend({
name: "KRCreate",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
'c-cell': () => import('@/components/common/c-cell.vue'),
'group-cell': () => import('@/components/common/group-cell.vue'),
'c-button': () => import('@/components/common/c-button.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
show:false,
object:'',
people:'',
period:'',
}
},
computed: {
},
methods:{
isShow(){
this.show=!this.show
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
......@@ -19,6 +19,7 @@
<div class=" py-3.5">归档</div>
</div>
</van-action-sheet>
<!-- 内容 -->
<div class="pt-14 px-4 pb-16">
<!-- 头部栏 -->
<div class="flex justify-around ">
......
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<div class="pt-14 px-4 pb-16">
<div v-for="(tag,index) in tags" :key="index" class="rounded" >
<div class="border-b pl-2.5 pr-1 w-full flex items-center bg-white" :class="classBorder(index)" @click="clickIcon(index)">
<app-icon
slot="icon"
:icon-name="checked === index+'' ? 'radio-checked': 'radio'"
class-name="w-4 h-4 mr-2 flex items-center"
/>
<div class="flex rounded px-1 flex items-center my-2" :class="tagColor(tag)">
<van-icon name="success" />
<div class="text-sm"> {{tag.condition}}</div>
</div>
</div>
</div>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
import { Icon } from 'vant';
Vue.use(Icon);
export default Vue.extend({
name: "KRState",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
checked:'',
tags:[
{key:'start',condition:'未开始'},
{key:'doing',condition:'进行中'},
{key:'end',condition:'已完成'},
{key:'stop',condition:'已搁置'},
],
count:0,
}
},
computed: {
},
methods:{
clickIcon(index:number){
this.count=this.tags.length
if(this.checked===index+''){
this.checked=''
}else{
this.checked=index+''
}
},
classBorder(index:number){
if(index===this.tags.length-1){
return 'border-none '
}
if(index===0){
return 'mt-3'
}
},
tagColor(object: {key: string, condition: string}){
if(object.key==='start'){
return 'text-tag-red bg-tag-red-lighter'
}else if(object.key==='doing'){
return 'text-tag-yellow bg-tag-yellow-lighter'
}else if(object.key==='end'){
return 'text-tag-green bg-tag-green-lighter'
}else if(object.key==='stop'){
return 'text-tag-primary bg-tag-primary-lighter'
}else{
return ' '
}
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<div class="pt-14 px-4 pb-16">
<div v-for="(tag,index) in tags" :key="index" class="rounded" >
<div class="border-b pl-2.5 pr-1 w-full py-2.5 flex items-center bg-white rounded" :class="classBorder(index)" @click="clickIcon(index)">
<app-icon
slot="icon"
:icon-name="checked === index+'' ? 'radio-checked': 'radio'"
class-name="w-4 h-4 mr-2 flex items-center"
/>
<div class="text-sm">
{{tag.condition}}
</div>
</div>
</div>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
import { Icon } from 'vant';
Vue.use(Icon);
export default Vue.extend({
name: "OAccessibility",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
checked:'',
tags:[
{key:'private',condition:'私有(仅OKR负责人和所有参与人可见)'},
{key:'public',condition:'公开'},
],
count:0,
}
},
computed: {
},
methods:{
clickIcon(index:number){
this.count=this.tags.length
if(this.checked===index+''){
this.checked=''
}else{
this.checked=index+''
}
},
classBorder(index:number){
if(index===this.tags.length-1){
return 'border-none '
}
if(index===0){
return 'mt-3'
}
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<app-icon
slot="right"
icon-name="dot-h"
class-name="w-5 h-3 flex items-center "
@click="isShow()"
/>
<!-- 弹窗 -->
<van-action-sheet v-model="show" >
<div class="text-text-secondary px-6 ">
<div class="border-b py-3.5 ">分享到</div>
<div class="border-b py-3.5">拷贝任务</div>
<div class="border-b py-3.5">删除</div>
<div class=" py-3.5">归档</div>
</div>
</van-action-sheet>
<!-- 内容 -->
<div class="pt-14 px-4 pb-16">
<!-- 头部栏 -->
<div class="flex justify-around">
<div class="relative flex flex-col items-center border-r-2 w-1/3">
<div class=" text-xs text-text-secondary" @click="showDate = true">周期</div>
<van-calendar v-model="showDate" title="选择日期"
:round="false" type="range" @confirm="onConfirm"
:allow-same-day="true" :show-confirm="false"
color="#61C7FF" :style="{ height:'100%'}" />
<div class="mt-4 inherit absolute bottom-0">
<div>{{date}}</div>
<div >{{dateStart}}</div>
<div>{{dateEnd}}</div>
</div>
</div>
<div class="flex flex-col items-center border-r-2 w-1/3">
<div class="text-xs text-text-secondary ">状态</div>
<div class="flex items-center mt-2">
<dashboard
:percentage="percentage"
:strokeWidth="5"
:width="58"
>
<div
slot="content"
class="flex flex-col items-center"
>
<div class="text-lg">{{ percentage + '%'}}</div>
</div>
</dashboard>
</div>
</div>
<div class="relative flex flex-col items-center w-1/3">
<div class="text-xs text-text-secondary mb-1" @click="$router.push('/team/team-frame')">负责人</div>
<div class="inherit absolute bottom-0">
<img src="@/assets/icons/avator.png" alt="" class="w-9 h-9">
<div>张三</div>
</div>
</div>
</div>
<!-- 信息栏 -->
<div>
<group-cell class="mt-4" title="更多信息">
<c-cell title="优先级" titleClass="text-sm text-text-secondary">
<div slot="right" class="flex items-center">
<div class="text-sm rounded-full px-2 border border-red-500 text-red-500">紧急</div>
<app-icon
icon-name="right-arrow"
class-name="ml-5 w-1.5 h-3 flex items-center"
@click="$router.push('/okr/o-priority')"
/>
</div>
</c-cell>
<c-cell title="关联" titleClass="text-sm text-text-secondary" >
<app-icon
slot="right"
icon-name="right-arrow"
class-name="ml-5 w-1.5 h-3"
@click="$router.push('/okr/o-relation')"
/>
</c-cell>
<c-cell title="可访问性" titleClass="text-sm text-text-secondary">
<div slot="content" class="">私有</div>
<app-icon
slot="right"
icon-name="right-arrow"
class-name="ml-5 w-1.5 h-3 flex items-center"
@click="$router.push('/okr/o-accessibility')"
/>
</c-cell>
<c-cell title="参与人员" titleClass="text-sm text-text-secondary">
<div slot="right" class="flex items-center text-sm ">
<div class="">
10
</div>
<app-icon
icon-name="right-arrow"
class-name="ml-5 w-1.5 h-3"
@click="$router.push('/team/team-frame')"
/>
</div>
</c-cell>
<c-cell title="所有附件" titleClass="text-sm text-text-secondary">
<div slot="right" class="flex items-center text-sm ">
<div class="">
(附件数量)2
</div>
<app-icon
icon-name="right-arrow"
class-name="ml-5 w-1.5 h-3"
/>
</div>
</c-cell>
<c-cell label="描述">
<div slot="content" class="text-sm px-4 -mt-2">
负责人/执行人有权选择和更改所有内容的具体信息;参与人员仅可查看、
添加参与人员和上传附件;所有参与人将被动添加至上级O的参与人员中.....
</div>
<app-icon
slot="right"
icon-name="right-arrow"
class-name="w-1.5 h-3"
@click="$router.push('/okr/o-describe')"
/>
</c-cell>
</group-cell>
<group-cell class="mt-4" title="拓展属性">
<app-icon
slot="suffix"
icon-name="right-arrow"
class-name="w-1.5 h-3"
@click="$router.push('/okr/o-extendedAttribute')"
/>
<c-cell title="客户单位" titleClass="text-sm text-text-secondary">
<div slot="content" class="text-sm">XXX有限责任公司</div>
</c-cell>
<c-cell title="客户代表" titleClass="text-sm text-text-secondary">
<div slot="content" class="text-sm">张凯丽</div>
</c-cell>
<c-cell title="联系方式" titleClass="text-sm text-text-secondary">
<div slot="content" class="text-sm">173644832910</div>
</c-cell>
</group-cell>
</div>
<!-- 底部栏 -->
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
import { ActionSheet } from 'vant';
import { Icon } from 'vant';
import { Calendar } from 'vant';
Vue.use(Calendar);
Vue.use(Icon);
Vue.use(ActionSheet);
export default Vue.extend({
name: "KRDetail",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
'dashboard': () => import('@/views/okr/components/dashboard.vue'),
'c-cell': () => import('@/components/common/c-cell.vue'),
'group-cell': () => import('@/components/common/group-cell.vue')
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
show:false,
showDate:false,
date:'',
dateStart:'4月4日',
dateEnd:'5月5日',
percentage: 40,
love:false,
loveColor:false,
like:30,
comment:12
}
},
computed: {
},
methods:{
isShow(){
this.show=!this.show
},
isLove(){
this.love=!this.love
this.loveColor=!this.loveColor
if(this.love===true){
this.like++
}else{
this.like--
}
},
formatDate(date:Date) {
let month=date.getMonth() + 1
let day=date.getDate()
if(month<10){
if(day<10){
return `0${date.getMonth() + 1}月0${date.getDate()}日`;
}else{
return `0${date.getMonth() + 1}${date.getDate()}日`;
}
}else{
if(day<10){
return `${date.getMonth() + 1}月0${date.getDate()}日`;
}else{
return `${date.getMonth() + 1}${date.getDate()}日`;
}
}
},
onConfirm(date: [any, any]) {
const [start, end] = date;
this.showDate = false;
this.dateStart = `${this.formatDate(start)}`;
this.dateEnd = ` ${this.formatDate(end)}`;
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
mainBg="bg-white"
headerBg="bg-white"
>
<div class="pt-14 px-4 pb-16">
<textarea cols="30" rows="5" v-model="value" class="w-full bg-common-bg px-9 py-4"></textarea>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
import { Icon } from 'vant';
Vue.use(Icon);
export default Vue.extend({
name: "ODescribe",
components: {
'main-page': () => import('@/layout/main-page.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
value:'hello'
}
},
computed: {
},
methods:{
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<div class="pt-14 mx-4 bg-white">
<div class="flex border-b w-full py-2.5 px-2.5" @click=" clickIcon1()">
<app-icon
slot="icon"
:icon-name="checked1 ? 'radio-checked': 'radio'"
class-name="w-4 h-4 mr-2 flex items-center"
/>
<div class="text-sm">
内部
</div>
</div>
<div class="relative flex items-center border-b py-2.5 px-2.5" @click=" clickIcon2()">
<app-icon
slot="icon"
:icon-name="checked2 ? 'radio-checked': 'radio'"
class-name="w-4 h-4 mr-2 flex items-center"
/>
<div class="text-sm">
外部
</div>
<app-icon
slot="icon"
icon-name="right-arrow"
class-name="w-1.5 h-3 mr-2 flex items-center inherit absolute right-2.5"
@click="isShow()"
/>
</div>
<div class="pl-5" v-if="show">
<c-cell title="客户单位" titleClass="text-sm text-text-secondary" class="border-b">
<div slot="content" >XXX有限责任公司</div>
</c-cell>
<c-cell title="客户代表" titleClass="text-sm text-text-secondary" class="border-b">
<div slot="content" >张凯丽</div>
</c-cell>
<c-cell title="联系方式" titleClass="text-sm text-text-secondary">
<div slot="content" >173644832910</div>
</c-cell>
</div>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
import { Icon } from 'vant';
Vue.use(Icon);
export default Vue.extend({
name: "OExtendedAttribute",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
'c-cell': () => import('@/components/common/c-cell.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
checked1:false,
checked2:false,
tags:[
{key:'private',condition:'内部'},
{key:'public',condition:'外部'},
],
show:false
}
},
computed: {
},
methods:{
clickIcon1(){
this.checked1=!this.checked1
if(this.checked1===true){
this.checked2=false
}
},
clickIcon2(){
this.checked2=!this.checked2
if(this.checked2===true){
this.checked1=false
}
},
isShow(){
this.show=!this.show
this.checked2=!this.checked2
}
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
mainBg="bg-white"
headerBg="bg-white"
>
<app-icon
slot="right"
icon-name="search-blue"
class-name="w-7 h-7 flex items-center "
@click="$router.push('/okr/o-search')"
/>
<!-- 内容 -->
<div class="pt-14 pb-16">
<div class="flex justify-center w-full mb-6">
<div
v-for="tab in tabs"
:key="tab.key"
class="w-32 h-9 flex items-center justify-center"
:class="currentKey === tab.key ? 'text-color-primary rounded-full bg-blue-50' : 'text-text-secondary'"
@click="clickTab(tab)"
>
{{ tab.label }}
</div>
</div>
<div v-show="showLeader">
<leader-card></leader-card>
<leader-card></leader-card>
</div>
<div v-show="showObject">
<object-card :taskList="list"></object-card>
</div>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
name: "OObjective",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
'leader-card': () => import('@/views/okr/components/leader-card.vue'),
'object-card': () => import('@/views/okr/components/object-card.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
tabs: [
{
label: '负责人',
key: 'leader'
},
{
label: '目标',
key: 'objective'
}
],
list:[
{id:1,type:'urgent',typeName:'紧急',thing:'按优先级排列,同级按首字母排列'},
{id:2,type:'important',typeName:'重要',thing:'b增强公司内部管理制度2'},
{id:1,type:'urgent',typeName:'紧急',thing:'a增强公司内部管理制度1'},
{id:3,type:'common',typeName:'一般',thing:'d增强公司内部管理制度3'},
{id:2,type:'important',typeName:'重要',thing:'g增强公司内部管理制度2'},
{id:3,type:'common',typeName:'一般',thing:'c增强公司内部管理制度3'},
],
currentKey: 'leader',
showLeader:true,
showObject:false,
}
},
computed: {
},
methods:{
clickTab(tab: {label: string, key: string}) {
this.currentKey = tab.key
if(tab.key==='leader'){
this.showLeader=true
this.showObject=false
}else if(tab.key==='objective'){
this.showLeader=false
this.showObject=true
}
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<div class="pt-14 px-4 pb-16">
<div v-for="(tag,index) in tags" :key="index" class="rounded" >
<div class="border-b pl-2.5 pr-1 w-full py-2.5 flex items-center bg-white rounded" :class="classBorder(index)" @click="clickIcon(index)">
<app-icon
slot="icon"
:icon-name="checked === index+'' ? 'radio-checked': 'radio'"
class-name="w-4 h-4 mr-2 flex items-center"
/>
<div class="text-sm rounded-full px-2.5 mr-2.5" :class="tagColor(tag)">
{{tag.condition}}
</div>
</div>
</div>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
import { Icon } from 'vant';
Vue.use(Icon);
export default Vue.extend({
name: "OPriority",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
checked:'',
tags:[
{key:'zero',condition:'(无)'},
{key:'urgent',condition:'紧急'},
{key:'important',condition:'重要'},
{key:'common',condition:'普通'},
{key:'low',condition:'较低'},
],
count:0,
}
},
computed: {
},
methods:{
clickIcon(index:number){
this.count=this.tags.length
if(this.checked===index+''){
this.checked=''
}else{
this.checked=index+''
}
},
classBorder(index:number){
if(index===this.tags.length-1){
return 'border-none '
}
if(index===0){
return 'mt-3'
}
},
tagColor(object: {key: string, condition: string}){
if(object.key==='zero'){
return ' '
}else if(object.key==='urgent'){
return 'text-tag-red border border-tag-red '
}else if(object.key==='important'){
return 'text-tag-yellow border border-tag-yellow'
}else if(object.key==='common'){
return 'text-tag-green border border-tag-green '
}else if(object.key==='low'){
return 'border border-current'
}else{
return ' '
}
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<!-- 选择地点 -->
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<app-icon
slot="right"
icon-name="edit"
class-name="w-4 h-4 flex items-center "
@click="$router.push('/okr/o-objective')"
/>
<!-- 内容 -->
<div class="pt-14 pb-16 px-4">
<div class="flex justify-center w-full mb-6">
<div
v-for="tab in tabs"
:key="tab.key"
class="w-32 h-9 flex items-center justify-center"
:class="currentKey === tab.key ? 'text-color-primary rounded-full bg-blue-100' : 'text-text-secondary'"
@click="clickTab(tab)"
>
{{ tab.label }}
</div>
</div>
<div v-show="showLeader">
<!-- 列表 -->
<div class="mt-9">
<div class="bg-white px-2.5 py-4 rounded relative">
<app-icon
icon-name="avator"
class-name="w-9 h-9 absolute top-2 right-2"
/>
<!-- 标题 -->
<div class="flex items-center">
<div class="text-sm color-tag text-emergency border border-emergency rounded-full py-px px-2.5 mr-2.5">紧急</div>
<div class="flex-1 pr-9 truncate">{{ task.name }}</div>
</div>
<!-- 时间信息 -->
<div class="flex mt-1.5">
<div class="text-xs bg-text-extreme-light text-text-secondary rounded-sm py-0.5 px-1.5">开始时间:{{ task.startTime }}</div>
<div class="text-xs bg-text-extreme-light text-text-secondary rounded-sm py-0.5 px-1.5 ml-4">截至时间:{{ task.endTime }}</div>
</div>
<!-- 统计 -->
<c-progress :task-list="task.list" />
</div>
</div>
<!-- 列表 -->
<div class="mt-9">
<div class="bg-white px-2.5 py-4 rounded relative">
<app-icon
icon-name="avator"
class-name="w-9 h-9 absolute top-2 right-2"
/>
<!-- 标题 -->
<div class="flex items-center">
<div class="text-sm text-tag-yellow border border-tag-yellow rounded-full py-px px-2.5 mr-2.5">重要</div>
<div class="flex-1 pr-9 truncate">{{ task.name }}</div>
</div>
<!-- 时间信息 -->
<div class="flex mt-1.5">
<div class="text-xs bg-text-extreme-light text-text-secondary rounded-sm py-0.5 px-1.5">开始时间:{{ task.startTime }}</div>
<div class="text-xs bg-text-extreme-light text-text-secondary rounded-sm py-0.5 px-1.5 ml-4">截至时间:{{ task.endTime }}</div>
</div>
<!-- 统计 -->
<c-progress :task-list="task.list" />
</div>
</div>
</div>
</div>
</main-page>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
name: "ORelation",
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
'c-progress': () => import('@/views/okr/components/progress.vue')
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
tabs: [
{
label: '同级',
key: 'same'
},
{
label: '上级',
key: 'superior'
},
{
label: '下级',
key: 'subordinate'
}
],
currentKey: 'same',
showLeader:true,
task: {
name: '增强公司内部管理制度',
tag: 'emergency',
startTime: '04月01日',
endTime: '04月14日',
list: [
{
type: 'completed',
typeName: '已完成',
num: 2
},
{
typeName: '进行中',
type: 'inProgress',
num: 2
},
{
type: 'notStart',
typeName: '未开始',
num: 1
},
{
type: 'shelved',
typeName: '搁置中',
num: 1
}
]
}
}
},
computed: {
},
methods:{
clickTab(tab: {label: string, key: string}) {
this.currentKey = tab.key
// if(tab.key==='superior'){
// this.showLeader=true
// this.showObject=false
// }else if(tab.key==='subordinate'){
// this.showLeader=false
// this.showObject=true
// }
},
}
})
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div class="fixed top-0z left-0 w-screen z-50">
<div class="relative flex justify-center items-center py-3 h-12 ">
<div class="absolute left-3 top-1/2 transform -translate-y-1/2 ">
<app-icon
icon-name="left-arrow"
class-name="w-6 h-6"
@click="$router.go(-1)"
/>
</div>
<div class="flex items-center justify-center w-2/3 rounded-full bg-common-bg">
<app-icon
icon-name="search-light"
class-name="w-7 h-7 mx-1"
/>
<input v-model="value" type="text" placeholder="请输入搜索关键词" class="bg-common-bg" >
</div>
<div class="absolute right-3 top-1/2 transform -translate-y-1/2">
<button class="text-color-primary" @click="clickCancel()">取消</button>
</div>
</div>
</div>
<!-- <div>
<ul v-for="(data,index) in Seach(value)" :key="index">{{data.thing}}</ul>
</div> -->
<div class="px-4 pt-8">
<div class="mt-6 ">负责人</div>
<div>
<div v-for="(object,index) in leaders" :key="index" class=" rounded" >
<div class="border-b pl-2.5 pr-1 w-full flex items-center text-sm">
<app-icon
slot="icon"
icon-name="radio"
class-name="w-6 h-6 mr-2 flex items-center"
/>
<app-icon
icon-name="avator"
class-name="w-8 h-8 flex items-center mx-4"
/>
<div class="w-screen ">{{object}}</div>
</div>
</div>
</div>
<div class="mt-2 ">目标</div>
<div>
<div v-for="(object,index) in objects" :key="index" class="rounded" >
<div class="border-b pl-2.5 pr-1 py-2 w-full flex items-center text-sm">
<app-icon
icon-name="radio"
class-name="w-4 h-4 mr-6 flex items-center"
/>
<div class=" px-2 mr-2 rounded-full border border-tag-red text-tag-red">{{object.condition}}</div>
<div >{{object.thing}}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
name: 'OSearch',
components: {
'app-icon': () => import('@/components/common/Icon.vue'),
},
data(){
return{
value:'有',
checked:'',
// datas:[
// {condition:'紧急',thing:'b增强公司内部管理制度1'},
// {condition:'重要',thing:'b增强公司内部管理制度2'},
// {condition:'紧急',thing:'a增强公司内部管理制度1'},
// {condition:'一般',thing:'d增强公司内部管理制度3'},
// ],
objects:[
{condition:'紧急',thing:'有~增强公司内部管理制度'},
],
leaders:[
'有/点击展开 再次点击姓名 收起',
'有XX',
],
}
},
computed: {
},
methods: {
clickCancel(){
this.value=""
},
//根据字段筛选
// Seach(value:string){
// return this.datas.filter(item => {
// if(item.thing.includes(value)){
// return item;
// }
// })
// }
}
});
</script>
<style lang="less">
</style>
<template>
<!-- 所有成员 -->
<div class="team-frame">
<main-page left-arrow @click-left="$router.go(-1)">
<template slot="right">
<app-icon
type="png"
class-name="w-6.5 h-6.5"
:path="require('@/assets/icons/search.png')"
/>
</template>
<div class="px-4 pt-14">
<!-- 团队架构详情 -->
<team-tree
:tree-data="team"
@click-child="clickItem"
/>
<!-- 通讯录 -->
<div class="pb-16">
<div class="text-text-secondary py-1">成员</div>
<team-contacts
:radio="showRadio"
:checked.sync="checkedMemberId"
:contacts="contacts"
@click-member="clickMember"
/>
</div>
<!-- 底部操作 -->
<!-- <div class="py-2 px-4 bg-common-bg w-screen fixed bottom-0 left-0 z-30">
<template v-if="showRadio">
<c-button round @click="$router.go(-1)">确定</c-button>
</template>
<template v-else>
<div class="grid grid-cols-3 gap-2.5">
<c-button round @click="$router.push('/team/add-member')">添加成员</c-button>
<c-button round @click="$router.push('/team/add-department')">添加部门</c-button>
<c-button round @click="$router.push('/team/department-management')">部门设置</c-button>
</div>
</template>
</div> -->
</div>
</main-page>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
import { team, contacts } from '@/DTO'
import { Member } from '@/DTO'
export default Vue.extend({
name: 'TeamFrame',
components: {
'main-page': () => import('@/layout/main-page.vue'),
'app-icon': () => import('@/components/common/Icon.vue'),
'team-tree': () => import('@/views/team/components/team-tree.vue'),
'team-contacts': () => import('@/views/team/components/team-contacts.vue'),
'c-button': () => import('@/components/common/c-button.vue')
},
created() {
// console.log(Mock, 'mock')
this.showRadio = this.$route.query.transfer === '1'
},
data() {
return {
title: '导航',
team,
contacts,
checkedMemberId: [],
showRadio: false
}
},
methods: {
clickMember(member: Member) {
this.$router.push({
path: '/schedule/schedule-home',
query: {
member: JSON.stringify(member)
}
})
},
clickItem(val: Member) {
// console.log(val)
if (this.showRadio) {
this.$router.push({
path: `/schedule/team/${val.id}`,
query: {
transfer: '1'
}
})
return
}
this.$router.push(`/schedule/team/${val.id}`)
}
}
})
</script>
<style lang="less">
</style>
......@@ -93,25 +93,6 @@ export default Vue.extend({
<style lang="less" scoped>
.larg{
animation:larg 1s linear infinite alternate ;
}
.long{
animation:long 1s linear infinite alternate;
}
.short{
animation:short 1s linear 0.5s infinite alternate;
}
@keyframes larg{
0%{width:80px;height:80px;}
}
@keyframes long{
0%{height:30px;}
}
@keyframes short{
0%{height:30px;}
}
// .wrapper {
// -webkit-backface-visibility: hidden;
......
<template>
<!-- 加入/创建团队 -->
<div class="team-frame">
<main-page
left-arrow
@click-left="$router.go(-1)"
>
<div class="px-4 pt-14 pb-4">
<div class="rounded bg-indigo-100 text-indigo-500 px-2 py-2 text-sm">批量导入需要先下载下方的批量导入模版,将成员信息全部按要求完成填写后,可选择下方上传信息表,自动识别并添加所有成员。</div>
<div >
<div class="flex justify-between items-center bg-white rounded px-4 py-3 my-4" >
<div>下载模板</div>
<app-icon
slot="right"
icon-name="dot"
class-name="w-1 h-1 flex items-center"
/>
</div>
<div class="flex justify-between items-center bg-white rounded px-4 py-3 ">
<div>上传信息表</div>
<app-icon
slot="right"
icon-name="dot"
class-name="w-1 h-1 flex items-center"
/>
</div>
</div>
<div class="absolute flex justify-center bottom-1/4 inset-x-0 " v-show="show">
<div class="bg-gray-700 text-white px-4 py-4 rounded w-1/3 text-center">下载已完成</div>
<div class="bg-gray-700 text-white px-4 py-4 rounded w-1/3 ml-4 text-center">上传成功</div>
</div>
<van-popup v-model="show" position="bottom" class="px-4 py-3">
<div v-show="show" class="w-full rounded-full py-2 px-2 text-center bg-gray-500 text-white">上传中...</div>
<div v-show="show" class="w-full rounded-full py-2 px-2 text-center bg-gray-500 mt-3 text-white">下载中...</div>
</van-popup>
<van-overlay :show="show" />
</div>
</main-page>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
import { Overlay } from 'vant';
import { Popup } from 'vant';
Vue.use(Popup);
Vue.use(Overlay);
export default Vue.extend({
name: 'Import',
components: {
'main-page': () => import('@/layout/main-page.vue'),
"app-icon": () => import("@/components/common/Icon.vue"),
},
created() {
// console.log(Mock, 'mock')
},
data() {
return {
show:true,
}
},
methods: {
}
})
</script>
<style lang="less">
</style>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment